3

環境: 最近の Ubuntu の非標準パッケージは、あまり風変わりなものでなければ問題ありません。

次のデータを処理するデータ プロセッサ bash スクリプトがありますstdin

$ cat data | process_stdin.sh

スクリプトを変更できます。

SSH経由でマシンにログインし、スクリプトを呼び出してデータをパイプするレガシーデータプロデューサーシステム(変更できない)があります。擬似コード:

foo@producer $ cat data | ssh foo@processor ./process_stdin.sh

レガシー システムは./process_stdin.sh、1 日に無数の回数起動します。

プロセス起動のオーバーヘッドを取り除くために、マシンで./process_stdin.sh無期限に実行し続けたいと思います。processor従来のプロデューサは、実際のプロセッサ プロセスに何らかの方法でデータをパイプするある種のラッパーを呼び出します。

最小限のコードで私がやりたいことを行うための堅牢な unix-way の方法はありますか? 私は (あまり) 変更したくありません./process_stdin.sh— 完全な書き直しは既に予定されていますが、残念ながら、すぐには間に合いません — そして、データ プロデューサーを変更することはできません。

4

2 に答える 2

4

(そうではない) 汚いハックは次のようになります。

の場合と同様fooprocessor、fifo を作成し、のstdintail -fリダイレクトされたを実行します。おそらく無限ループになります。process_stdin.sh

foo@processor:~$ mkfifo process_fifo
foo@processor:~$ while true; do tail -f process_fifo | process_stdin.sh; done

心配しないでください。この時点process_stdin.shでは、 fifo に何かが到着するのを待っているだけprocess_fifoです。無限ループは、何か問題が発生した場合に備えて再起動されるようになっています。

次に、次のようにデータを送信できます。

foo@producer:~$ cat data | ssh foo@processor "cat > process_fifo"

これがあなたにいくつかのアイデアを与えることを願っています!

于 2013-07-07T16:34:16.320 に答える
1

群れは仕事をします。

同じコマンドがすぐに 3 回要求されましたが、ロックが解放されるまで待機しています。

# flock /var/run/mylock -c 'sleep 5 && date' &
[1] 21623
# flock /var/run/mylock -c 'sleep 5 && date' &
[2] 21626
# flock /var/run/mylock -c 'sleep 5 && date' &
[3] 21627
# Fri Jan  6 12:09:14 UTC 2017
Fri Jan  6 12:09:19 UTC 2017
Fri Jan  6 12:09:24 UTC 2017
于 2017-01-06T12:18:19.160 に答える