捕获进程/退出的任何可能的解决方案?

Who*_*ami 6 c linux

我想捕获进程entry,exit并维护整个系统的日志(可能是守护进程).

一种方法是阅读/proc定期文件系统和维护列表,因为我没有看到注册可能性inotify/proc.此外,对于桌面应用程序,我可以得到帮助dbus,每当客户端注册到桌面时,我都可以捕获.

但对于非桌面应用程序,我不知道如何/proc定期继续阅读.

请提供建议.

Jan*_*dec 1

如果您想真正记录所有进程的进入和退出,则需要挂钩到内核。这意味着修改内核或至少编写内核模块。“linux安全模块”肯定会允许挂钩进入,但我不确定是否可以挂钩退出。

如果您可以忍受偶尔退出(如果二进制文件静态链接或以某种方式避免您的环境设置),那么有一个简单的选择,即预加载库。

Linux动态链接器有一个功能,如果环境变量LD_PRELOAD (参见这个问题)命名了一个共享库,它会强制将该库加载到启动进程中。因此,您可以创建一个库,该库将在其静态初始化中告诉守护进程进程已启动并执行此操作,以便进程能够发现进程何时退出。

静态初始化最简单的方法是在 C++ 中使用构造函数创建全局对象。动态链接器将确保静态构造函数在加载库时运行。

它还会尝试在进程退出时运行相应的析构函数,因此您可以简单地将进程记录在构造函数和析构函数中。但如果进程因信号 9 (KILL) 而死亡,则它将不起作用,并且我不确定其他信号会做什么。

因此,您应该有一个守护进程,并在构造函数中告诉守护进程有关进程启动的信息,并确保它会注意到进程何时自行退出。我想到的一个选择是向守护进程打开一个 unix 域套接字并使其保持打开状态。当进程终止并且守护进程会注意到时,内核将关闭它。您应该采取一些预防措施来为套接字使用高描述符编号,因为某些进程可能会假设低描述符编号(3、4、5)对dup2它们来说是空闲的。并且不要忘记为守护进程和整个系统允许更多的文件描述符。

请注意,仅轮询 /proc 文件系统,您可能会错过大量仅存活一瞬间的进程。Unix 上确实有很多。