如何从另一个 shell 会话获取进程退出状态?

如何从另一个 shell 会话获取进程退出状态?

假设我在一个 shell 会话中运行一个命令,例如bash -c 'apt-get update && apt-get upgrade'。5 分钟后,我决定出去吃点东西,然后意识到我忘了添加某种形式的通知机制退出是否成功或失败。

那么,我现在该怎么做?如果我能从另一个终端查询该命令(或具体来说,该 PID)的退出状态,也许我最终可以显示某种弹出窗口。所以问题是:我如何从另一个终端查询已在运行的进程的退出状态?

换句话说,

假设我在终端 A 中有一个正在运行的进程,并且它的 PID 是已知的

当我在终端 B 执行某些命令时

然后我应该能够知道终端 A 中的进程是否以退出状态 0 或退出状态 >1 结束。

答案1

使用strace方法如下:

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

这里既不需要系统调用也不需要信号,所以我们告诉它strace-e表达式忽略它们,并用 抑制状态消息-qstrace附加到 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

大部分功劳归功于U&L 上的这个答案,如果您发现这有用,请留下赞。

相关内容