在Linux中,如何在某个进程终止时获得通知

在Linux中,如何在某个进程终止时获得通知,linux,posix,opensuse,Linux,Posix,Opensuse,我正在运行一个进程,我想从中获得另一个进程终止的通知。 在windows中,我们可以通过传递我们感兴趣的进程终止句柄来使用WaitForSingleObject。我是Linux世界的新手,请推荐一些方法。可能值得一试。如果您可以在子进程中获取子进程的进程id,那么您可以将其保存到子进程中的文件中,并从父进程中读取它。然后在父进程中,您可以使用ps ax | cut-b 1-5 | grep fooprocessid以固定的间隔轮询子进程的存在。当然存在更优雅的方法,但这适用于任何编程语言,在这种

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

可能值得一试。

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


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

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

有多个Linux API可用于执行此操作。以下是其中的一些:

  • Netlink process connector—这是一个API,可以精确地执行您想要的操作,但在跟踪短期流程的详细信息时会出现问题
  • audit API—在大多数发行版上默认启用的内核API,它可以为每个系统调用向usermode发送事件(如果您采用这种方法,则需要跟踪类似exec和fork的系统调用)
  • tracepoints和kprobes—两个内核调试API,可用于获取有关进程生命周期事件的信息
  • 基于ebpf的解决方案-可与跟踪点/kprobes结合使用,以过滤内核中的事件或运行各种逻辑
  • 基于ptrace的解决方案-包括简单的ptrace调试以及seccompapi

在一个StackOverflow答案中,确实有太多的细节,无法正确比较这些选项,但我有。

您好,谢谢您的回答,但是我可以使用我的C代码进行监视吗?此外,我的进程没有任何父子关系。是的,您可以使用C代码-
ptrace()
是一个库函数(
man2ptrace
获取更多信息)。为了监视非子进程,您的监视程序需要使用
root
权限或
CAP\u SYS\ptrace
功能运行(
man7capabilities
获取有关如何在不授予完全
root
访问权限的情况下设置这些功能的信息)谢谢你的回复,我会查一查的。