【问题标题】:how to detect Linux shutdown/reboot如何检测 Linux 关机/重启
【发布时间】:2014-02-25 09:23:31
【问题描述】:

我正在尝试在我的 c 程序中检测从 Linux 关闭或重新启动。 我发现该程序可以使用信号(SIGTERM,处理程序)(SIGKILL,处理程序)。 但是如果用户用命令杀死进程,这两个也会触发。

在某些解决方案中,他们说可以使用运行级别,但它不起作用。 不知道进程是否在系统初始化运行级别之前被杀死。 我什至尝试将脚本放在 rcx.d 中,但它仍然不起作用。

有人有什么建议吗? 我需要在多种Linux系统上运行。

谢谢。

[更新] 我使用 R 解决方案,但我仍然没有看到我的数据在重新启动或关机时是清晰的。 是不是我的功能不对??

int start() {
    if (initIni() == EXIT_FAILURE)
        return EXIT_FAILURE;
    struct sigaction act;
    memset(&act, '\0', sizeof(act));
    act.sa_sigaction = &signal_callback_handler;
    act.sa_flags = SA_SIGINFO;
    sigaction(SIGTERM, &act, NULL);
....
}

void signal_callback_handler(int signum, siginfo_t *siginfo, void *context) {
    if (signum == SIGTERM && (long)siginfo->si_pid == 1) {
        clearData();
    }
    exit(signum);
}

[更新] 最后,我使用 David Schwartz runlevel(8) example 来解决我的问题。 如果您使用 linux 命令运行级别,它将没有用。 感谢您提供出色的解决方案。

【问题讨论】:

  • 你想用这个关机/重启信号做什么?重启进程,例如?
  • 硬件和软件信号有区别。
  • 注意 SIGKILL 不能被捕获!
  • 我会使用信号清除一些数据

标签: c linux shutdown


【解决方案1】:

你的假设是错误的。没办法抓到SIGKILL;它终止进程,没有机会响应它。

话虽如此,我可能有一个解决方案:您可以捕获SIGTERM,如果您使用sigactionSA_SIGINFO 标志安装信号处理程序,您应该能够确定哪个进程向您发送了@ 987654325@ 信号。如果它来自init (pid 1),则表示关闭。这有点骇人听闻,但可能适合您的目的。

【讨论】:

  • 你好,我尝试使用你的解决方案,但它仍然不会在关机时触发。请看我上面的更新。谢谢。
【解决方案2】:

捕捉信号。在处理程序中,读取/var/run/utmp 文件以获取运行级别。请参阅runlevel(8) 命令的source code 以供参考。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-14
    • 1970-01-01
    • 2017-01-09
    • 2011-08-29
    • 2017-12-16
    • 1970-01-01
    相关资源
    最近更新 更多