[英]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
,如果你使用sigaction
和SA_SIGINFO
標志安裝信號處理程序,你應該能夠確定哪個進程發送了SIGTERM
信號。 如果它來自init
(pid 1),那就是關機。 這有點hackish但可能適合您的目的。
抓住SIGTERM。 在處理程序中,讀取/var/run/utmp
文件以獲取運行級別。 請參閱runlevel(8)
命令的源代碼以供參考。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.