在C语言Linux中捕获系统事件

3
我正在Linux上编写一个应用程序,需要我捕获系统事件,例如:
1.系统重启 2.用户“xyz”登录 3.“xyz”应用程序崩溃等
并且需要根据此执行一些功能。例如:
1.运行备份脚本 2.运行恢复程序等。
请问有人可以告诉我如何在C/Linux中捕获系统事件吗?
注:我不是在谈论文件系统事件。

首先,在Google上搜索“运行级别”。 - Some programmer dude
ж‚ЁеЏҮд»ӨдҢүз”Ёregister_reboot_notifierжіЁе†ЊдёЂдёҒењЁй‡ҚеђҮж—¶и°ѓз”Ёзљ„е‡Ңж•°гЂ‚ - Felix
2个回答

4

“系统事件”没有概念。 您需要指定需要处理的事件并实现适当的处理机制:

  • 系统启动: init进程在启动期间从/etc/init.d调用脚本。 基础架构在各个发行版之间略有差异,但Linux标准库系统初始化应该通常适用于所有系统。

  • 用户登录/注销:LSB还定义了与Pluggable Authentication Modules(PAM)库的接口。 您可以实现一个共享库,在登录期间将调用它(以及其他需要身份验证和授权的操作)。 根据您想要做什么,可能已经有适合您的模块,因此请先尝试查找。 在任一情况下,我认为安装适合自己使用的 PAM 模块并没有一个不依赖于发行版的方法,即使在给定的发行版上,您也必须考虑管理员可能进行了自定义修改,因此安装需要管理员进行手动干预。

  • 应用程序崩溃:您必须对其进行检测。


谢谢回复。好的,Linux 中没有像 inotify() 这样监听系统事件并通知应用程序的东西吗? - openstk
1
@Shrirang:正如我所说,首先根本没有系统事件的概念。GNU/Linux像其他Unix一样,系统是由大多数独立组件构建的。其中一个负责初始化,一个负责身份验证和授权,一个负责图形用户界面等。每个组件都可以单独替换,有时甚至会被替换。例如,统一身份验证的PAM库比Linux内核要年轻得多。而虽然SysV Init更老,但在一些发行版中正在被upstart替换(幸运的是支持init脚本)。 - Jan Hudec

4
我认为你应该考虑阅读系统日志 - 你所询问的一切都被记录在syslog中(对于标准配置)。如果你的系统使用syslog-ng,那么你甚至可以将其配置为直接写入你的程序,请参见http://www.syslog.org/syslog-ng/v2/#id2536904了解详情。但即使使用其他syslog守护进程,你也可以像tail -f一样从/var/log读取文件(或文件),并对特定消息做出反应。
我不确定如何捕获应用程序崩溃 - 内核选项可以记录用户进程中的每个SIGSEGV,但据我所知,它仅适用于ARM架构 - 最后的选择是将你的应用程序作为工具(正如Jan Hudec所指出的)以将某些内容记录到syslog中。

谢谢回复。我猜阅读系统日志会有很大的性能开销。每分钟我们将不得不处理数百行:P 但无论如何,我也会评估这个解决方案。 - openstk
2
@Shrirang:实际上这是一个相当不错的选择。Syslog守护进程非常灵活,因此您可以告诉它将您感兴趣的特定事件的日志写入单独的位置,甚至可以告诉它通过管道或套接字将它们发送给您。但您仍然只能事后反应,因此根据您想要做什么,可能是否合适。当然,您仍然需要从init脚本启动。 - Jan Hudec
2
性能在这里不应该是一个大问题,我正在处理一个项目,使用Perl脚本处理syslog条目,我们可以轻松地每秒处理几十万行。如果您正确配置syslog - 仅获取您实际感兴趣的内容 - 性能应该不成问题。 - kompas

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接