【问题标题】:Catching system events in C Linux在 C Linux 中捕获系统事件
【发布时间】:2012-11-19 09:03:16
【问题描述】:

我正在 Linux 上编写一个应用程序,它需要我捕捉系统事件,例如:

  1. 系统重启
  2. 用户“xyz”登录
  3. “xyz”应用程序崩溃等

并且需要在此基础上执行一些功能。例如:

  1. 运行备份脚本
  2. 运行恢复程序等

谁能告诉我如何在 C/Linux 中捕获系统事件?

P.S:我不是在谈论“文件系统”事件:P

【问题讨论】:

  • 首先在“运行级别”上进行谷歌搜索。
  • 你可以注册一个在重启时调用的函数register_reboot_notifier

标签: c++ c linux system


【解决方案1】:

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

  • 系统启动:init 进程在启动期间从/etc/init.d 调用脚本。确切的基础架构在不同发行版之间略有不同,但 Linux Standards Base System Initialization 通常应该适用于所有发行版。

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

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

【讨论】:

  • 感谢您的回复。好的,Linux 中没有像 inotify() 这样的东西来监听系统事件并通知应用程序吗?
  • @Shrirang:正如我所说,首先没有系统事件的概念。 GNU/Linux 与任何其他 Unix 一样,系统是由大部分独立的组件构建的。一个负责初始化,一个负责身份验证和授权,一个负责图形用户界面等。每个都可以单独替换,有时甚至可以替换。例如。统一认证的 PAM 库比 Linux 内核年轻得多。虽然 SysV Init 更老,但现在在某些发行版中已被 upstart 取代(幸运的是支持 init 脚本)。
【解决方案2】:

我认为您应该考虑阅读系统日志 - 您询问的所有内容都会记录到系统日志中(用于标准配置)。如果您的系统使用 syslog-ng,那么您甚至可以将其配置为直接写入您的程序,详情请参阅http://www.syslog.org/syslog-ng/v2/#id2536904。但即使使用任何其他 syslog 守护程序,您也始终可以像 tail -f 那样从 /var/log 读取文件(或多个文件),最终对特定消息做出反应。

我不确定捕获应用程序崩溃 - 有一个内核选项可以记录用户进程中的每个 SIGSEGV,但 AFAIK 它仅适用于 ARM 架构 - 最后的手段是检测您的应用程序(正如 Jan Hudec 指出的那样)将某些内容记录到 syslog。

【讨论】:

  • 感谢您的回复。我猜读取系统日志会产生巨大的性能开销。每分钟我们都必须处理数百行:P 但是我也会评估这个解决方案的任何方式
  • @Shrirang:其实这是一个不错的选择。 syslog 守护进程非常灵活,因此您可以告诉它将您感兴趣的特定事件的日志写入一个单独的位置,您甚至可以告诉它通过管道或套接字将它们发送给您。但是你仍然只能事后做出反应,所以它可能合适也可能不合适,这取决于你想做什么。当然,您仍然需要从 init 脚本启动。
  • 性能在这里应该不是一个大问题,我正在做一个项目,我们正在使用 perl 脚本处理系统日志条目,我们可以轻松地每秒处理多达几十万行。如果您正确配置 syslog - 只获取您真正感兴趣的内容 - 性能应该没有问题。
猜你喜欢
  • 2010-10-11
  • 1970-01-01
  • 2013-05-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-06-12
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多