一尘不染

如何检测Linux关闭/重新启动

linux

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

他们说,在某些解决方案中,可以使用运行级别,但无法运行。在系统初始化运行级别之前,不知道该进程是否被杀死。我什至尝试将脚本放在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)示例解决我的问题。如果您使用linux命令运行级别,它将不会有用。感谢您的出色解决方案。


阅读 218

收藏
2020-06-07

共1个答案

一尘不染

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

2020-06-07