如何检测Linux关机/重启

时间:2014-02-25 09:23:32

标签: c linux shutdown

我正在尝试在我的c程序中检测Linux的关闭或重启。 我发现程序可以使用signal(SIGTERM,handler)(SIGKILL,handler)。 但是,如果用户也使用命令终止进程,则会触发这两个。

在某些解决方案中,他们说可以使用运行级别,但它不起作用。 在系统初始化运行级别之前,不知道进程是否被kill。 我甚至尝试将脚本放在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命令运行级别,它将没有用。 谢谢你的解决方案。

2 个答案:

答案 0 :(得分:6)

你的假设是错误的。没有办法抓住SIGKILL;它终止了这个过程,没有机会回应它。

话虽如此,我可能有一个解决方案:您可以捕获SIGTERM,如果您使用sigactionSA_SIGINFO标志安装信号处理程序,您应该能够确定哪个进程向您发送了SIGTERM信号。如果它来自init(pid 1),那就是关机。这是轻微的hackish但可能适合您的目的。

答案 1 :(得分:3)

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