別のシェルセッションからプロセスの終了ステータスを取得するにはどうすればよいですか?


7

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

さて、私は今何をしますか?別の端末からその他のコマンド(または具体的にはそのPID)の終了ステータスを問い合わせることができれば、おそらく何らかのポップアップを表示することができるでしょう。だから問題は:別の端末からすでに実行中のプロセスの終了ステータスを問い合わせるにはどうすればよいですか?

言い換えると、

端末Aで実行中のプロセスがあり、そのPIDがわかっている

端末Bでコマンドを実行するとき

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


コマンドBで「ウォッチャー」をアタッチした後、指定された任意のプロセスA(PIDが与えられた)が終了すると何か(終了コードを報告するアラートコマンド?)Aが、後でBを入力したのと同じシェルで実行されているバックグラウンドジョブであるとは想定できません。
バイトコマンダー

@ByteCommander正解。それはフォアグラウンドの仕事です。
Sergiy Kolodyazhnyy

別のシェルの子から戻りコードを取得することはできないと思います。wait終了後、現在のシェルでバックグラウンドプロセスのコードを取得するために使用できますが、他のシェルにクエリを実行できるものは見つかりませんでした。プロセスがまだ実行されているかどうかを監視し、プロセスが終了したときにアラートを発生させることも、簡単ですが、その終了コードを見つけることはできません。私が考えることができる唯一の方法PROMPT_COMMANDは、一時ファイルまたは同様のアクセス可能な場所に最後の終了コードを格納するようにシェルを準備することを必要とするでしょう。それはオプションでしょうか?
バイトコマンダー

@ByteCommanderいいえ。端末Aを準備する必要はありません。端末Bからすべてを実行します。信頼してください。それは可能です。
Sergiy Kolodyazhnyy

1
まあ、それは永久的な準備になるでしょう(一度.bashrcを編集する)が、大丈夫です。答えを見つけたら楽しみに読んでください。
バイトコマンダー

回答:


8

strace次のように使用します。

sudo strace -e trace=none -e signal=none -q -p $PID

ここではシステムコールもシグナルも関係ないのでstrace-e式でそれらを無視し、でステータスメッセージを抑制するように指示します-qstracePID $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

クレジットのほとんどはU&Lのこの回答に送られます。これが有用だと思われる場合は、そこに賛成票を残してください。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.