3

我正在运行一个进程,我想从中获得另一个进程终止的通知。在 Windows 中,我们可以使用 WaitForSingleObject,通过传递我们感兴趣的终止进程的句柄。我是 Linux 世界的新手,请提出一些方法。

4

5 回答 5

1

可能值得检查supervisord

于 2013-03-07T15:46:52.620 回答
1

在 Linux(实际上是大多数 *NIXen)上,您只能等待当前进程的子进程,除非您具有 root 权限(或允许一般跟踪的有效功能 - 这可以通过功能系统进行安排,而无需授予完全 root 权限访问,但需要有意识地配置它...),您可以使用ptrace()它附加到任意进程以监视它们。

于 2013-03-07T16:20:02.883 回答
1

您可以使用多个 Linux API 来执行此操作。这里是其中的一些:

  • Netlink 进程连接器 - 这是一个 API 可以精确地执行您想要的操作,但在跟踪详细信息的短暂进程时存在问题
  • 审计 API - 在大多数发行版上默认启用的内核 API,它可以为每个系统调用向用户模式发送事件(如果你走这条路,你需要跟踪类似 exec 和 fork 的系统调用)
  • tracepoints 和 kprobes - 两个内核调试 API,可用于获取有关进程生命周期事件的信息
  • 基于 ebpf 的解决方案 - 可以与 tracepoints/kprobes 结合使用以过滤内核中的事件或运行各种逻辑
  • 基于 ptrace 的解决方案 - 这些包括简单的 ptrace 调试以及 seccomp API

在单个 StackOverflow 答案中正确比较这些选项确实有太多细节,但我已经在我的博客上详细写过

于 2020-10-06T07:40:47.693 回答
0

如果您可以在子进程中获取子进程的进程ID,则可以将其保存到子进程中的文件中,然后在父进程中从那里读取。然后在父进程中,您可以ps ax | cut -b 1-5 | grep fooprocessid以恒定的时间间隔轮询子进程的存在。当然存在更优雅的方法,但这适用于任何编程语言,其中在子进程中您可以获取进程 ID,在父进程中您可以执行命令。

如果您知道一些可以用ps(or top) 找出的细节并将子进程与所有其他进程区分开来,那么您甚至不需要子进程的进程 IDps ax | grep foo就足够了。或者ps使用其他一些参数,这取决于您对子进程了解的详细信息。

于 2013-03-07T16:15:57.707 回答
0

在现代 Linux(从内核版本 5.3 开始)中,有pidfd_open内核 API 允许将进程 ID 包装到与 、 和其他进程兼容的句柄pollepoll

手册页。

于 2021-09-18T22:00:47.907 回答