比方說,例如,我創建一個問題,故意塊 從關閉操作系統(可能是一段時間(1)能做到這一點?)
都能跟得上。它不會工作。一個進程不能忽略一些信號,如SIGKILL和SIGSTOP,除了init
。
一般來說,你可以在SIGTERM後立即發送SIGKILL:沒有標準延遲讓應用程序終止。但是,在內核沒有進一步通知的情況下,讓這樣的應用程序有機會整齊關閉是明智的。
更多信息here。
關於系統關機過程有些不同。的確,決定如何採取行動以及何時採取行動的系統是init
;操作系統在這個操作中幫助init守護程序,但間接地(傳送信號,清理資源等)。
所以,事實證明它是依賴於實現的。分析systemd-217後,似乎在發送SIGTERM後等待10秒鐘。
從SRC /核心/ shutdown.c在main
log_info("Sending SIGTERM to remaining processes...");
broadcast_signal(SIGTERM, true, true);
log_info("Sending SIGKILL to remaining processes...");
broadcast_signal(SIGKILL, true, false);
從SRC /核心/ killall.c在broadcast_signal
killall(sig, pids, send_sighup);
[...]
if (wait_for_exit)
wait_for_children(pids, &mask);
繼續,在wait_for_children
until = now(CLOCK_MONOTONIC) + TIMEOUT_USEC;
[...]
k = sigtimedwait(mask, NULL, &ts);
if (k != SIGCHLD)
其中TIMEOUT_USER
是#define TIMEOUT_USEC (10 * USEC_PER_SEC)
正如您所看到的,systemd會等待SIGCHLD,這表明該子進程已終止,因爲大多數正在運行的進程都是systemd的子進程。
是否有一個特定的上下文,你問這個問題,如信號發送到關機進程?如果不是,那麼在TERM之後不一定會發送KILL。一個進程可以接收TERM,忽略它,並保持運行沒有問題。 – cobbal
您是否嘗試過使用'time'命令來檢查'kill'命令 – Skynet
@cobbal:我無法找到一個例子。假設我的程序阻止了操作系統,或者不處理SIGKILL信號。它在這方面更具相關性嗎?有時,MMI可以通過Windows中的「不響應」來阻止操作系統。我在Linux上尋找一個沒有MMI的類似案例。 – xhaltar