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

时间:2012-01-11 13:28:37

标签: c linux

我想捕获进程entryexit并维护整个系统的日志(可能是一个守护进程)。

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

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

请提供建议。

4 个答案:

答案 0 :(得分:3)

你提到/ proc,所以我假设你有一个linux系统。

安装acct包。 lastcomm命令显示执行的所有进程及其运行持续时间,这是您要求的。让您的程序“tail”/ var / log / account / pacct(您将在acct(5)中找到它的结构)并且瞧。不过,这只是关于终止的通知。要检测初创企业,您需要定期深入了解系统流程表,如果这是您真正需要的。

答案 1 :(得分:2)

可能更安全的移动方式是创建一个充当父级并分叉子级的SuperProcess。每当子进程停止时,父亲就可以找到它。如果架构符合您的需求,那只是一个想法。

当然,如果 parent 进程不可行,那么你必须转到内核。

答案 2 :(得分:1)

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

如果您可以偶尔退出滑块(如果二进制文件静态链接或以某种方式避免您的环境设置),可以通过预加载库来实现一个简单的选项。

Linux动态链接器有一个功能,即如果环境变量LD_PRELOAD (see this question)命名共享库,它会强制将该库加载到启动过程中。所以你可以创建一个库,在它的静态初始化中告诉守护进程一个进程已经启动并执行它以便进程在进程退出时找出它。

通过在C ++中使用构造函数创建一个全局对象,可以轻松完成静态初始化。动态链接器将确保在加载库时静态构造函数将运行。

它还会尝试在进程退出时使相应的析构函数运行,因此您只需在构造函数和析构函数中记录该进程。但是如果过程死于信号9(KILL)并且我不确定其他信号会做什么,它将无法工作。

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

请注意,只是轮询/ proc文件系统,您可能会错过大量仅在瞬间生存的进程。 unix上确实有很多这样的。

答案 3 :(得分:0)

以下是我们提出的解决方案概要。

我们创建了一个程序,用于读取系统能够监视的所有可能应用程序的配置文件。该程序读取配置文件,并通过命令行界面启动或停止程序。程序本身将表存储在共享内存中,将应用程序标记为运行与否。任何人都可以访问的界面可以获得这些程序的状态。该程序还有一个警报系统,可以发送电子邮件/寻呼或发出警报。

此解决方案不需要对内核进行任何更改,因此是一种不那么痛苦的解决方案。

希望这有帮助。