Ser*_*nyy 8 command-line scripts process
假设我在一个 shell 会话中运行一个命令,例如bash -c 'apt-get update && apt-get upgrade'
. 5 分钟后,我决定出去吃点心,发现我忘记添加某种形式的退出是否成功或失败的通知机制。
那么,我现在该怎么办?如果我可以从另一个终端查询其他命令(或者特别是那个 PID)的退出状态,也许我毕竟可以显示某种弹出窗口。所以问题是:如何从另一个终端查询已运行进程的退出状态?
换句话说,
鉴于我在终端 A 中有一个正在运行的进程并且它的 PID 是已知的
当我在终端 B 中执行一些命令时
然后我应该能够知道终端 A 中的进程是否以退出状态 0 或退出状态 > 1 结束。
使用strace
方法如下:
sudo strace -e trace=none -e signal=none -q -p $PID
Run Code Online (Sandbox Code Playgroud)
这里对系统调用和信号都不感兴趣,所以我们告诉strace
用-e
表达式忽略它们并用 抑制状态消息-q
。strace
使用 PID 附加到进程$PID
,等待它正常退出并输出其退出状态,如下所示:
+++ exited with 0 +++
Run Code Online (Sandbox Code Playgroud)
if
调用任何类型通知的简单表达式可以是:
if sudo strace -e trace=none -e signal=none -q -p $PID |& grep -q ' 0 '; then
echo yeah
else
echo nope
fi
Run Code Online (Sandbox Code Playgroud)
# 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
Run Code Online (Sandbox Code Playgroud)
大部分功劳都归功于U&L 上的这个答案,如果您觉得这有用,请在那里点个赞。