スクリプトから次のコマンドを実行しています。
echo '{"hostUp": true}' | Sudo /usr/local/bin/netcat localhost 8001
ただし、netcatクライアントは無期限に開いたままになります。このデータが送信された後、どうすれば接続を閉じることができますか?
他の両方の回答-c
と-q
は正しいコンテキストでは正しいですが、複数の回答がある理由を要約し、より一般的な解決策を提供するのに役立つ場合があります。
これらの異なるオプションは同じことを行いますが、netcatの異なる実装です。
-c
GNU netcatの実装-q
netcatのOpenBSD実装。-w
(その他?)OpenBSDのnetcatの実装。一部のバージョンでは、-q
および-w
オプションを終了する前に待機する秒数を指定するintが必要です。バージョンに応じて、このintは> 0
または>= 0
でなければなりません。
複数のマシンに何かを実装していて、それらがnetcatの同じ実装を使用していることが確実でない場合は、netcat呼び出しをtimeout
プログラムでラップして、数秒後にnetcatを強制終了することを検討してください。
timeout 5 echo '{"hostUp": true}' | netcat localhost 8001
このアプローチは、データが正常に送信されているかどうかに関係なくnetcatの実行に上限を設けるため、少し扱いにくいですが、少量のデータを送信していて数秒の余裕がある場合、これは機能するはずです。 netcat実装を使用。
-q
パラメーターを使用できますが、netcat
サーバーも閉じられます。
$ echo '{"hostUp": true}' | Sudo /usr/local/bin/netcat -q 5 localhost 8001
私の場合、Homebrew(v 0.7.1)を介してインストールしたMacで使用していたnetcatのコピーには-qオプションがありませんでしたが、-cオプションを使用してSTDINを閉じることができましたEOFそしてコマンド全体をループに入れます:
while true ; do printf 'HTTP/1.1 200 OK\r\n\r\ncool, thanks' | netcat -l -c -p 8888 ; done
Windows -w 5(1秒以上で閉じるまでの秒数)
Windowsのブロードキャストアドレスにudpで「hello」を送信し、1秒後に閉じる例:
echo hello|nc -w 1 -u 10.0.30.255 -p 4000 5000
Ubuntu 18.04サーバーでは、次を使用する必要がありました:(manページにあります)
echo '{"hostUp": true}' | Sudo /usr/local/bin/netcat -N localhost 8001
明らかに-N
と類似しています -q
または-c
他のディストリビューション