web-dev-qa-db-ja.com

別のシェルセッションからプロセスの終了ステータスを取得する方法は?

bash -c 'apt-get update && apt-get upgrade'など、1つのシェルセッションでコマンドを実行するとします。 5分後、私はスナックのために外に出ることに決め、出口が成功したか失敗したかを 何らかの形の通知メカニズムを追加する を忘れたことに気付きました。

さて、私は今何をしますか?他のコマンド(または具体的にはそのPID)の終了ステータスを別の端末からクエリできれば、何らかのポップアップが表示される可能性があります。質問は次のとおりです。すでに実行中のプロセスの終了ステータスを別の端末から照会するにはどうすればよいですか?

言い換えると、

ターミナルAで実行中のプロセスがあり、そのPIDがわかっていると仮定します

ターミナルBでコマンドを実行するとき

その後、端末Aのプロセスが終了ステータス0または終了ステータス> 1で終了するかどうかを知ることができるはずです。

8

次のように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に関するこの回答 に送られます。これが役立つと思う場合は、そこに賛成票を残してください。

8
dessert