私がそれを起動した人ではない場合、プロセスが終了するまで待つ方法はありますか?任意のプロセスを待ち、Linuxでその終了コードを取得します
「ps -ef」を実行してPIDを選択すると(プロセス情報にアクセスする権利があると仮定して)、PIDが完了して終了コードを取得するまで待つことができますか?
私がそれを起動した人ではない場合、プロセスが終了するまで待つ方法はありますか?任意のプロセスを待ち、Linuxでその終了コードを取得します
「ps -ef」を実行してPIDを選択すると(プロセス情報にアクセスする権利があると仮定して)、PIDが完了して終了コードを取得するまで待つことができますか?
あなたは、プロセスIDを知っている場合は、bashの組み込みであるwait
コマンドを利用することができます:
wait PID
あなたは$!
を使用してbashで実行する最後のコマンドのPIDを取得することができます。または、ps
の出力からgrepすることができます。
実際、waitコマンドは、bashでparralelコマンドを実行するのに便利な方法です。ここでは例です:
# Start the processes in parallel...
./script1.sh 1>/dev/null 2>&1 &
pid1=$!
./script2.sh 1>/dev/null 2>&1 &
pid2=$!
./script3.sh 1>/dev/null 2>&1 &
pid3=$!
./script4.sh 1>/dev/null 2>&1 &
pid4=$!
# Wait for processes to finish...
echo -ne "Commands sent... "
wait $pid1
err1=$?
wait $pid2
err2=$?
wait $pid3
err3=$?
wait $pid4
err4=$?
# Do something useful with the return codes...
if [ $err1 -eq 0 -a $err2 -eq 0 -a $err3 -eq 0 -a $err4 -eq 0 ]
then
echo "pass"
else
echo "fail"
fi
は、私はPIDが完了するまで待ち、その終了コードを取得することができます方法はあり
はい、プロセスが他の誰かによってptrace
Dされていない場合は、あなたをそれにはPTRACE_ATTACH
があり、さまざまなイベント(受信された信号など)とその終了に関する通知が届きます。
注意してください。これは正しく処理するには非常に複雑です。
これは任意のプロセスで動作しますか? from http://linux.die.net/man/2/ptrace - ptrace()システムコールは、** parent **プロセスが別のプロセスの実行を監視し、制御する手段を提供します。 – user1296013
@ user1296013はい、権限を持っている任意のプロセス(すでにptracedされていないプロセス)で動作します(例えば、killすることができれば)。 'ptrace(PTRACE_ATTACH、..)'を実行すると、親になります。 –
@EmployedRussianこれは実際に[Greg's Wiki](http://mywiki.wooledge.org/ProcessManagement)に追加する必要があります。 – l0b0
信号とシステムコールを追跡するstrace
を使用できます。あまりに印刷取得^Z
、fg
とkill -USR1
から
$ strace -e none -e exit_group -p $PID # process calls exit(1)
Process 23541 attached - interrupt to quit
exit_group(1) = ?
Process 23541 detached
$ strace -e none -e exit_group -p $PID # ^C at the keyboard
Process 22979 attached - interrupt to quit
--- SIGINT (Interrupt) @ 0 (0) ---
Process 22979 detached
$ strace -e none -e exit_group -p $PID # kill -9 $PID
Process 22983 attached - interrupt to quit
+++ killed by SIGKILL +++
シグナル:プログラムが完了するまで、次のコマンドを待ち、その終了コードを印刷します。いずれにしても、シェルスクリプトで終了コードを使用する場合は、sed
を使用する必要があります。
シェルコードが多すぎる場合は、しばらく前にprogram I hacked together in Cを使用できます。それはptrace()
を使用して信号を捕捉し、pidのコードを終了します。 (荒いエッジがあり、すべての状況で機能しない可能性があります)
私は助けてくれることを願っています!
はい。しかし、そのpidがあなたの子供の一人である場合にのみ、pidの終了コードを待つことができるということを付け加えたいと思っていました。 –
ああ、ありがとう@賛同者のキュー、私はそれを知らなかった。 –
これは元のプロセスが呼び出されたシェルでのみ機能します。任意のプロセスではありません。 –