有没有办法听过程?

Nir*_*Nir 9 linux process shell-script

我想知道是否有办法在 Linux 和 unix 中监听进程——它何时结束以及进程(脚本)的退出代码是什么。

我不想编写一个脚本来运行X几秒钟并检查ps -ef | grep PID进程是否还活着。我想知道是否有办法让进程在结束时通知我,以及它的退出代码是什么。

Ans*_*ann 7

一种 - 公认的严厉 - 方法是使用strace

$ strace -e trace=none -e signal=none -p 12345
Run Code Online (Sandbox Code Playgroud)

将使用 PID 12345 监视进程,不拦截系统调用(第一个-e)和信号(第二个-e)。一旦进程以常规方式退出,将打印退出值。

如果进程被信号终止,strace 将静默退出(使用上面给出的选项运行时)。您可以使用 eg-e signal=kill来改变这种行为。但是请注意,如果程序接收和处理信号,则-e signal=all(或等效地省略该-e signal选项)可能会产生大量输出。


les*_*ana 3

Bash 会为你做到这一点。当进程结束时,它会通过将控制权交还给您来通知您,并将退出状态存储在特殊变量中$?。它看起来大致是这样的:

someprocess
echo $?
Run Code Online (Sandbox Code Playgroud)

有关详细信息,请参阅有关特殊参数的 bash 手册。

但我假设您在等待时想做其他工作。在 bash 中你可以这样做:

someprocess &
otherwork
wait %+
echo $?
Run Code Online (Sandbox Code Playgroud)

someprocess &将在后台启动该过程。这意味着控制权将立即返回,您可以做其他工作。在后台启动的进程在 bash 中称为作业。wait将等待给定作业完成,然后返回该作业的退出状态。作业由 引用%n%+指最后开始的作业。有关更多信息,请参阅有关作业控制的 bash 手册。

如果你确实需要PID,你也可以这样做:

someprocess &
PID=$!
otherwork
wait $PID
echo $?
Run Code Online (Sandbox Code Playgroud)

$!是一个特殊变量,包含最后启动的后台进程的 PID。