私は、netcat を使用してローカルホストの通信を監視する監視スクリプトを作成しようとしています。作成したスクリプトは 2 つあり、1 つは監視ループを開始するためのスクリプト、もう 1 つはループ自体のためのスクリプトです。スクリプトの内容は次のとおりです。
スタート
#!/bin/bash
netcat localhost 1099 | bash loop.sh &
ループ
#!/bin/bash
while read sInput; do
...do something with $sInput
done
このアプリケーションをフォアグラウンドで実行するだけでは問題なく動作しますが、このスクリプトをバックグラウンドで実行しようとすると、すぐに実行から停止に切り替わります。なぜこのようなことが起こるのか、またこの問題を軽減するにはどうすればよいのか、どなたか教えてください。
私の最終目標は、Arch Linux デーモン スクリプトを作成してすべてが完璧に動作する bash スクリプトを作成することです。ご協力いただければ幸いです。
答え1
標準入力 (stdin) から読み取っているようです。-d
(stdin からの読み取りを試行しない) オプションを追加してみてくださいnetcat
。または、コマンド ラインでリダイレクトします。
netcat localhost 1099 <&- | bash loop.sh &
nohup
シェルが停止する前に終了した場合に悪影響が出ないようにするために、を使用することもできます。
答え2
netcat プロセスは標準入力から読み取ります。ターミナルに接続されているため、netcat が属するプロセス グループ (つまりパイプライン) はフォアグラウンドで実行する必要があります。
パイプラインの先頭に、サーバーが期待する入力を送信するものを接続する必要があります。たとえば、HTTPサーバーの場合は、次のようなものになります。
netcat localhost 1099 <<EOF | … &
GET HTTP/1.0 http://localhost:1099/somewhere
X-Header: wibble
EOF
サーバーが入力を読み取らない場合は、netcat
の入力を からリダイレクトします/dev/null
。
答え3
別途新しいデーモン化された bash スクリプトを必要とせずにパイプを提供するユーティリティを発見しました。役に立つかもしれません:https://github.com/flonatel/pipexec
pipexec -- [NETCAT netcat localhost 1099] [LOOP bash loop.sh] '{NETCAT:1>LOOP:0}'