如何检测Linux关机/重启

我试图检测closures或从我的C程序从Linux重新启动。 我发现程序可以使用signal(SIGTERM,handler)(SIGKILL,handler)。 但是如果用户用命令杀死这个进程,这两个也会触发。

在一些解决scheme,他们说可以使用运行级别,但它不会工作。 在系统初始化运行级别之前,不知道进程是否被终止。 我甚至尝试把脚本放在rcx.d中,但它仍然不起作用。

有没有人有一些build议? 我需要在多种Linux系统上运行。

谢谢。

[更新]我使用R解决scheme,但仍然没有看到我的数据在重新启动或关机清除。 是我的function是错误的?

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)的例子来解决我的问题。 如果你使用linux命令运行级别,这将是没有用的。 感谢您的伟大的解决scheme。

Solutions Collecting From Web of "如何检测Linux关机/重启"

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

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

这就是说,我可能有一个解决方案:你可以捕获SIGTERM ,如果你用sigactionSA_SIGINFO标志安装信号处理程序,你应该能够确定哪个进程发送了SIGTERM信号。 如果它来自init (pid 1),那就是关机。 这是一个温和的黑客,但可能会为你的目的。