私が以下のように持っていると仮定test.sh
します。目的は、このスクリプトによっていくつかのバックグラウンドタスクを実行することです。このスクリプトは、いくつかのファイルを継続的に更新します。バックグラウンドタスクが何らかの理由で終了した場合は、再度開始する必要があります。
#!/bin/sh
if [ -f pidfile ] && kill -0 $(cat pidfile); then
cat somewhere
exit
fi
while true; do
echo "something" >> somewhere
sleep 1
done &
echo $! > pidfile
./test.sh | otherprogram
そしてそれを例えばのように呼びたい./test.sh | cat
。
バックグラウンドプロセスがまだ存在し、出力を生成する可能性があるため、パイプは閉じられていません。パイプを最後に閉じるように指示するにはどうすればよいtest.sh
ですか?pidfile
pipeコマンドを呼び出す前に存在を確認するよりも良い方法はありますか?
バリアントとして、の最後にを使用#!/bin/bash
してみましたが、パイプが閉じられるのをまだ待っています。disown
test.sh
私が実際に達成しようとしていること:ここにあるような、さまざまなスクリプト(、、、、など)の出力を収集する「ステータス」スクリプトuptime
があります。スクリプトの出力はウィンドウマネージャーに渡され、ウィンドウマネージャーに表示されます。それは私のGNU画面の収益でも使用されています。free
date
get-xy-from-dbus
test.sh
使用するスクリプトの中には、出力の作成に時間がかかるものがあるため、出力コレクションから切り離したいと思います。そこで、それらをループに入れます。while true; do script; sleep 1; done
ループは、まだ実行されていない場合に開始されます。
ここでの問題は、デーモンプロセスを「実際に」デタッチするように呼び出し元のスクリプトに指示する方法がわからないことです。