bash -c 'apt-get update && apt-get upgrade'
など、1つのシェルセッションでコマンドを実行するとします。 5分後、私はスナックのために外に出ることに決め、出口が成功したか失敗したかを 何らかの形の通知メカニズムを追加する を忘れたことに気付きました。
さて、私は今何をしますか?他のコマンド(または具体的にはそのPID)の終了ステータスを別の端末からクエリできれば、何らかのポップアップが表示される可能性があります。質問は次のとおりです。すでに実行中のプロセスの終了ステータスを別の端末から照会するにはどうすればよいですか?
言い換えると、
ターミナルAで実行中のプロセスがあり、そのPIDがわかっていると仮定します
ターミナルBでコマンドを実行するとき
その後、端末Aのプロセスが終了ステータス0または終了ステータス> 1で終了するかどうかを知ることができるはずです。
次のようにstrace
を使用します。
Sudo strace -e trace=none -e signal=none -q -p $PID
ここではシステムコールもシグナルも関係ないので、strace
に-e
式でそれらを無視し、-q
でステータスメッセージを抑制するように指示します。 strace
はPID $PID
でプロセスにアタッチし、正常に終了するまで待機し、次のように終了ステータスを出力します。
+++ exited with 0 +++
任意のタイプの通知を呼び出す簡単なif
式は次のとおりです。
if Sudo strace -e trace=none -e signal=none -q -p $PID |& grep -q ' 0 '; then
echo yeah
else
echo nope
fi
# in terminal 1
$ (echo $BASHPID;sleep 10;true)
8807
# in terminal 2
$ if Sudo strace -e{trace,signal}=none -qp8807|&grep -q ' 0 ';then echo yeah;else echo nope;fi
yeah
# in terminal 1
$ (echo $BASHPID;sleep 10;false)
12285
# in terminal 2
$ if Sudo strace -e{trace,signal}=none -qp12285|&grep -q ' 0 ';then echo yeah;else echo nope;fi
nope
クレジットの大部分は &Lに関するこの回答 に送られます。これが役立つと思う場合は、そこに賛成票を残してください。