4

私が以下のように持っていると仮定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ですか?pidfilepipeコマンドを呼び出す前に存在を確認するよりも良い方法はありますか?

バリアントとして、の最後にを使用#!/bin/bashしてみましたが、パイプが閉じられるのをまだ待っています。disowntest.sh


私が実際に達成しようとしていること:ここにあるような、さまざまなスクリプト(、、、、など)の出力を収集する「ステータス」スクリプトuptimeがあります。スクリプトの出力はウィンドウマネージャーに渡され、ウィンドウマネージャーに表示されます。それは私のGNU画面の収益でも使用されています。freedateget-xy-from-dbustest.sh

使用するスクリプトの中には、出力の作成に時間がかかるものがあるため、出力コレクションから切り離したいと思います。そこで、それらをループに入れます。while true; do script; sleep 1; doneループは、まだ実行されていない場合に開始されます。

ここでの問題は、デーモンプロセスを「実際に」デタッチするように呼び出し元のスクリプトに指示する方法がわからないことです。

4

3 に答える 3

3

これが目的に合っているかどうかを確認してください: (while ループ内のコマンドの stderr に関心がないことを前提としています。関心がある場合は、コードを調整します。:-) )

#!/bin/bash

if [ -f pidfile ] && kill -0 $(cat pidfile); then
    cat somewhere
    exit
fi

while true; do
    echo "something" >> somewhere
    sleep 1
done >/dev/null 2>&1 &
echo $! > pidfile
于 2012-10-25T14:12:36.177 に答える
2

たとえば、標準出力である 1 のように、ファイル記述子を明示的に閉じたい場合は、次のようにして実行できます。

exec 1<&-

これは POSIX シェルで有効です。こちらを参照してください。

于 2012-10-02T12:32:33.910 に答える
0

while ループを明示的なサブシェルに配置し、サブシェルをバックグラウンドで実行すると、目的の動作が得られます。

(while true; do
    echo "something" >> somewhere
    sleep 1
done)&
于 2012-10-02T11:34:54.650 に答える