web-dev-qa-db-ja.com

既に実行中のprog1に「&& prog2」を追加することはできますか?

ほとんどのシェルは、&&;などの関数を提供して、特定の方法でコマンドの実行をチェーンします。しかし、コマンドが既に実行されている場合でも、最初のコマンドの結果に応じて、実行する別のコマンドを追加することはできますか?

私が走ったと言う

$ /bin/myprog
some output...

本当に欲しかった/bin/myprog && /usr/bin/mycleanup。時間がかかりすぎるため、myprogを強制終了してすべてを再起動することはできません。できます Ctrl+Z それと、必要に応じてfg/bgこれにより、別のコマンドでチェーンすることができますか?

私は主にbashに興味がありますが、すべての一般的なシェルに対する回答は大歓迎です!

87
us2012

waitコマンドを使用して、同じシェルでこれを実行できるはずです。

$ sleep 30 &
[1] 17440

$ wait 17440 && echo hi

...30 seconds later...
[1]+  Done                    sleep 30
hi

Bash manページからの抜粋

wait [n ...]
     Wait for each specified process and return its termination status. Each n 
     may be a process ID or a job specification; if a job spec is given,  all 
     processes  in that job's pipeline are waited for.  If n is not given, all 
     currently active child processes are waited for, and the return status is 
     zero.  If n specifies a non-existent process or job, the return status is 
     127.  Otherwise, the return status is the exit status of the last process 
     or job waited for.
118
slm

fgは、再開したプログラムの終了コードを返します。したがって、プログラムを一時停止できます ^Zfg && ...を使用して再開します。

$ /bin/myprog
some output...
^Z
[1]+ Stopped              /bin/myprog
$ fg && /usr/bin/mycleanup
63
John Kugelman

あなたが求めているものが可能かどうかはわかりませんが、プログラムを開始したシェルがまだある場合は、いつでも$?最後のプロセスの終了ステータス:

$ /bin/myprog
some output...
$ if [ $? -ne 0 ];then echo "non-zero exit status";else echo "0 exit status";fi
1
Joseph R.

ジョブがフォアグラウンドにある場合、これらのコマンドのどちらも期待どおりの動作になります。

[ $? -eq 0 ] && prog2
(( $? )) || prog2

注:$?終了時に実行中のプログラムの戻りステータスが含まれます。

これは、最初にコマンドを入力した場合のシェルの動作を明示的に示しています。

prog1 && prog2

最初のコマンドがstdinから読み取っておらず、フォアグラウンドで実行されている場合、最初のコマンドの実行中に新しいコマンドを入力できます。シェルは、最初のコマンドが実行されると、それを読み取って実行します。コマンドがバックグラウンドで実行される場合、stdinを読み取っていない可能性があります。

編集:ジョブをバックグラウンドで配置し、WAITコマンドを使用することもできます。他のジョブもバックグラウンドで実行されている場合、これは注意して行う必要があります。 WAITコマンドが待機中のジョブのステータスを返すには、ジョブの指定が必要です。

1
BillThor