すでに実行中のprog1に「&& prog2」を何らかの方法で追加できますか?


87

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

私が走ったと言う

$ /bin/myprog
some output...

でも本当に欲しかった/bin/myprog && /usr/bin/mycleanupmyprogあまりにも多くの時間が失われるため、すべてを強制終了して再起動することはできません。必要に応じてCtrl+ Zfg/ を使用できbgます。これにより、別のコマンドにチェーンできますか?

私はほとんどbashに興味がありますが、すべての一般的なシェルの答えは大歓迎です!

回答:


118

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.

コマンドを待つことは仕事をするべきです。
BillThor

%、などのバックグラウンドプロセスのPIDを入力するための多数の短い形式が%1あり$!ます。PIDを指定することが重要です。そうしないと、2番目のコマンドが常に実行されます。
BillThor

@BillThor-あなたは答えを修飾するだけですか、それとも私に言っていますか?
slm

私は答えを修飾しています。プレーンでwaitは、目的の結果が得られません。タイプミスの可能性が少ないため、短い形式を使用するのが一般的です。
BillThor

2
光沢のある新しいバッジをおめでとうございます。)
terdon

63

fg再開するプログラムから終了コードを返します。したがって、プログラムを一時停止し^Z、それを使用fg && ...して再開できます。

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

終了する前に再度中断し、同じコマンドを別のコマンドで実行すると、mycleanupの最初のチェーンは置き換えられますか?
バーハンアリ

3
@BurhanAliをmyprog2回中断するfgと、終了コード20で終了します。これはゼロ以外であるため、連鎖mycleanupコマンドは実行されません。
n.st 2014年

1

求めていることが可能かどうかはわかりませんが、プログラムを開始したシェルがまだある場合は、常に$?最後のプロセスの終了ステータスを確認できます。

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

1
これは機能しますが、後でこれを手動で実行する必要があります。コマンドが終了したときに自動的に実行する必要があります。
slm

@slm同意した。私はその正確な問題の解決策を持っていません。
ジョセフR.

3
waitBashのコマンドを確認してください。
slm

1

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

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

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

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

prog1 && prog2

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

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


これは機能しますが、後でこれを手動で実行する必要があります。コマンドが終了したときに自動的に実行する必要があります。
slm

4
@slmコマンドが標準入力を読み取っていない限り、最初のコマンドの実行中に新しいコマンドを入力できます。シェルは、最初のコマンドが完了するとすぐにそれを読み取ります。
BillThor

バックグラウンドになった後、シェルで何かを行うと、おそらくホースが詰まっています。少なくとも予選によれば。これまでやってきたテスト!
slm

2
@BillThorそのコメントを回答に追加する必要があると思います。
ジョセフR.

2
はい、使用するwaitことも理想的ではありません。IMOの利点は、対処しているより明確なAPIを提供することです。何かが実行された後にコマンドラインでさらにコマンドを入力することは、私にとって少しハックのように思えました。wait戻りステータスに関して、実行中のPIDへの直接リンクを取得できないという問題が依然としてあります。これは、Bashの実装方法(stackoverflow.com/questions/356100/…)でさらに問題になるようです。したがって、これは得られるのと同じくらい良いかもしれません。
slm
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.