我想要捕获进程entry、exit并维护整个系统的日志(可能是守护进程)。
一种方法是定期读取/proc文件系统并维护列表,因为我看不到为/proc注册inotify的可能性。此外,对于桌面应用程序,我可以获得dbus的帮助,并且每当客户端注册到桌面时,我都可以捕获。
但对于非桌面应用程序,除了定期阅读/proc之外,我不知道该如何继续。
请提供建议。
发布于 2012-01-11 23:17:13
您提到了/proc,所以我假设您在那里有一个linux系统。
安装acct包。lastcomm命令显示所有已执行的进程及其运行持续时间,这就是您所要求的。让你的程序"tail“/var/log/account/pacct (你可以在acct(5)中找到它的结构),然后看看。不过,这只是一个终止通知。要检测启动,您需要定期挖掘系统进程表,如果这是您真正需要的话。
发布于 2012-01-11 22:36:46
也许更安全的迁移方式是创建一个充当父进程并派生子进程的SuperProcess。每次子进程停止时,父进程都可以找到它。这只是一种想法,以防架构适合您的需求。
当然,如果父进程不可用,那么您必须转到内核。
发布于 2012-01-11 22:15:27
如果您希望真正记录所有进程的进入和退出,则需要挂钩到内核。这意味着修改内核或者至少编写一个内核模块。"linux安全模块“肯定会允许钩子进入入口,但我不确定是否有可能挂钩进入出口。
如果你能忍受偶尔的出口滑过(如果二进制文件是静态链接的,或者以某种方式避开了你的环境设置),那么有一个简单的选择,那就是预加载库。
Linux动态链接器有一个特性,如果环境变量LD_PRELOAD (see this question)命名了一个共享库,它会将该库强制加载到启动进程中。所以你可以创建一个库,它将在它的静态初始化中告诉守护进程进程已经启动,并这样做,这样进程将发现进程何时退出。
静态初始化最简单的方法是在C++中使用构造函数创建一个全局对象。动态链接器将确保静态构造函数在加载库时运行。
它还会尝试让相应的析构函数在进程退出时运行,这样您就可以简单地在构造函数和析构函数中记录该进程。但是,如果进程死于信号9 (KILL),并且我不确定其他信号会做什么,它就不会工作。
因此,您应该有一个守护进程,并在构造函数中告诉该守护进程关于进程启动的信息,并确保它会注意到进程何时自行退出。我想到的一个选择是打开到守护进程的unix域套接字,然后让它保持打开状态。内核将在进程终止时关闭它,并且守护进程会注意到。您应该采取一些预防措施,对套接字使用高描述符编号,因为一些进程可能会假定低描述符编号(3,4,5)是空闲的,并对它们执行dup2操作。并且不要忘记为守护进程和系统允许更多的filedescriptors。
请注意,仅仅轮询/proc文件系统,您可能会错过大量仅存在于瞬间的进程。在unix上它们真的很多。
https://stackoverflow.com/questions/8820087
复制相似问题