我正在运行一个进程,我想从中获得另一个进程终止的通知。在 Windows 中,我们可以使用 WaitForSingleObject,通过传递我们感兴趣的终止进程的句柄。我是 Linux 世界的新手,请提出一些方法。
5 回答
可能值得检查supervisord
在 Linux(实际上是大多数 *NIXen)上,您只能等待当前进程的子进程,除非您具有 root 权限(或允许一般跟踪的有效功能 - 这可以通过功能系统进行安排,而无需授予完全 root 权限访问,但需要有意识地配置它...),您可以使用ptrace()
它附加到任意进程以监视它们。
您可以使用多个 Linux API 来执行此操作。这里是其中的一些:
- Netlink 进程连接器 - 这是一个 API 可以精确地执行您想要的操作,但在跟踪详细信息的短暂进程时存在问题
- 审计 API - 在大多数发行版上默认启用的内核 API,它可以为每个系统调用向用户模式发送事件(如果你走这条路,你需要跟踪类似 exec 和 fork 的系统调用)
- tracepoints 和 kprobes - 两个内核调试 API,可用于获取有关进程生命周期事件的信息
- 基于 ebpf 的解决方案 - 可以与 tracepoints/kprobes 结合使用以过滤内核中的事件或运行各种逻辑
- 基于 ptrace 的解决方案 - 这些包括简单的 ptrace 调试以及 seccomp API
在单个 StackOverflow 答案中正确比较这些选项确实有太多细节,但我已经在我的博客上详细写过。
如果您可以在子进程中获取子进程的进程ID,则可以将其保存到子进程中的文件中,然后在父进程中从那里读取。然后在父进程中,您可以ps ax | cut -b 1-5 | grep fooprocessid
以恒定的时间间隔轮询子进程的存在。当然存在更优雅的方法,但这适用于任何编程语言,其中在子进程中您可以获取进程 ID,在父进程中您可以执行命令。
如果您知道一些可以用ps
(or top
) 找出的细节并将子进程与所有其他进程区分开来,那么您甚至不需要子进程的进程 IDps ax | grep foo
就足够了。或者ps
使用其他一些参数,这取决于您对子进程了解的详细信息。
在现代 Linux(从内核版本 5.3 开始)中,有pidfd_open
内核 API 允许将进程 ID 包装到与 、 和其他进程兼容的句柄poll
中epoll
。