バックグラウンドでパイプラインbashスクリプトを実行する

バックグラウンドでパイプラインbashスクリプトを実行する

netcatを使用してローカルホスト通信を監視する監視スクリプトを作成しようとしています。私は2つのスクリプトを書いた。 1つは監視ループを開始することであり、もう1つはループ自体のためです。それらは次のとおりです。

起動ファイル

#!/bin/bash
netcat localhost 1099  | bash loop.sh &

ループドア

#!/bin/bash
while read sInput; do
     ...do something with $sInput
done

フォアグラウンドなしでこのアプリを実行するだけでは問題ありませんが、バックグラウンドでこのスクリプトを実行しようとするとすぐに実行が中断されます。これが起こる理由と、この問題を軽減する方法を教えてくれる人はいますか?

私の究極の目標は、アーチLinuxデーモンスクリプトを生成し、すべてが完全に実行されるようにするために使用できるbashスクリプトを持つことです。ご協力ありがとうございます。

答え1

標準入力(stdin)から読むようです。-d(標準入力から読み取ろうとしない)オプションをに追加するか、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/pipeexec

pipexec -- [NETCAT netcat localhost 1099]  [LOOP bash loop.sh] '{NETCAT:1>LOOP:0}'

関連情報