簡體   English   中英

如何檢測Linux關機/重啟

[英]how to detect Linux shutdown/reboot

我正試圖在我的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) 示例來解決我的問題。 如果你使用linux命令運行級別,它將沒有用。 謝謝你的解決方案。

你的假設是錯誤的。 沒有辦法抓住SIGKILL ; 它終止了這個過程,沒有機會回應它。

話雖如此,我可能有一個解決方案:你可以捕獲SIGTERM ,如果你使用sigactionSA_SIGINFO標志安裝信號處理程序,你應該能夠確定哪個進程發送了SIGTERM信號。 如果它來自init (pid 1),那就是關機。 這有點hackish但可能適合您的目的。

抓住SIGTERM。 在處理程序中,讀取/var/run/utmp文件以獲取運行級別。 請參閱runlevel(8)命令的源代碼以供參考。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM