1

私の質問は、私のバックグラウンド プロセスがスクリプトから開始されたことを除いて、これと非常によく似ています。私は何か間違ったことをしている可能性がありますが、この簡単な例を試してみると:

#!/bin/bash
set -mb  # enable job control and notification
sleep 5  &

スリープ バックグラウンド コマンドが終了しても、通知が届きません。ただし、ターミナルで直接同じことを実行すると、

$ set -mb  
$ sleep 5  &
$
[1]+  Done                    sleep 5

期待どおりの出力が表示されます。

私はcygwinでbashを使用しています。出力がどこに向けられているかに関係があるのではないかと推測していますが、さまざまな出力リダイレクトを試みても、これ以上近づきません。

編集:だから私は理由(thxからjkramerへ)についてより多くの情報を持っていますが、まだ方法を探しています。スクリプトから開始されたバックグラウンド プロセスが終了したという "プッシュ" 通知を受け取るにはどうすればよいですか? PID をファイルに保存してポーリングすることは、私が探しているものではありません。

4

2 に答える 2

1

ソースファイルとして実行する場合。その後、通知することができます。例えば

cat foo.sh

#!/bin/bash
set -mb  # enable job control and notification
sleep 5  &

. foo.sh
[1]+  Done                    sleep 5
于 2012-03-15T09:36:44.893 に答える
0

シェルのジョブ制御は、ターミナルによって制御されるプロセス、つまりシェルから直接開始されるタスクにのみ影響します。

親プロセス(スクリプト)が終了すると、initプロセスは自動的に子プロセス(sleepコマンド)の親になり、すべての出力を効果的に強制終了します。この例を試してください:

[jkramer/sgi5k:~]# cat foo.sh
#!/bin/bash

sleep 20 &
echo $!
[jkramer/sgi5k:~]# bash foo.sh 
19638
[jkramer/sgi5k:~]# ps -ef | grep 19638
jkramer  19638     1  0 23:08 pts/3    00:00:00 sleep 20
jkramer  19643 19500  0 23:08 pts/3    00:00:00 grep 19638

ご覧のとおり、スクリプトが終了した後のスリープの親プロセスは1、initプロセスです。子プロセスの終了について通知を受け取る必要がある場合は、$!の内容を保存できます。ファイルまたはどこかにある変数(最後に作成されたプロセスのPID)で、「wait」コマンドを使用してその終了を待ちます。

于 2010-05-08T21:10:01.447 に答える