7

Wait は、すべての子プロセスが停止するのを待っているわけではありません。これは私のスクリプトです:

#!/bin/bash

titlename=`echo "$@"|sed 's/\..\{3\}$//'`
screen -X title "$titlename"

/usr/lib/process.bash -verbose $@

wait

bash -c "mail.bash $@"
screen -X title "$titlename.Done"

/usr/lib/process.bashにはアクセスできませんが、頻繁に変更されるスクリプトなので参照したいのですが...そのスクリプトでは:

#!/bin/ksh
#lots of random stuff
/usr/lib/runall $path $auto $params > /dev/null 2>&1&

私の問題は、runallがログ ファイルを作成することです...そして、mail.bashがそのログ ファイルをメールで送信することになっていますが、runallが終了するのを待っているのではなく、 process.bashが終了するのを待っているだけのようです。とにかく、process.bashにアクセスせずに、または自分自身の最新バージョンのprocess.bashを維持しようとして、 runallが終了するまで待機を適切に待機させることはできますか? (ログ ファイルは前回の実行を上書きするため、常にログ ファイルが存在するため、ログ ファイルの存在を確認することはできません)

ありがとう、ダン

4

4 に答える 4

8
(
    . /usr/lib/process.bash -verbose $@
    wait
)

OS を起動させる代わりにprocess.bash、サブシェルを作成し、シェル スクリプトに入力されたかのようにすべてのコマンドを実行し、process.bashそのサブシェル内で待機します。

これにはいくつかの注意点がありますが、異常なことをしていなければうまくいくはずです。

于 2010-02-18T17:26:53.260 に答える
4

wait直接の子のみを待ちます。子が自分の子を生成する場合、それは待機しません。

于 2010-02-18T16:27:17.260 に答える
2

主な問題はprocess.bash、プロセスを終了したため、孤立して(PID 1)runallによって所有されることです。initプロセスリストを見ると、中間スクリプトが終了runallしたため、プロセスへの接続が表示されなくなります。この「孫」プロセスが孤立すると、この「孫」プロセスを検索する方法や同様process.bashの方法はありません。ps --ppid

wait特定の PID で実行できます。プロセスの PID を知っていrunallますか? そのようなプロセスが 1 つしかない場合は、これを試すことができます。これは、実行中のすべてrunallの sを待機します。

wait `pidof runall`
于 2010-02-18T16:31:14.877 に答える
1

待ちたいプロセスのPIDを回復できます

次に、この PID を引数としてコマンド Wait に渡します。

于 2010-02-19T00:10:07.677 に答える