2014-12-19 45 views
5

我試圖找出在發送SIGKILL之前接收SIGTERM時應用程序退出多少時間?SIGKILL之前多少時間

我對這些信號的瞭解很低。我已經在Stackoverflow的建議答案中閱讀了一些內容,但我無法在SIGTERminated之前「近似」瞭解一個進程可以存活多少時間。

編輯:比方說,例如,我創建故意阻止關閉操作系統的一個問題

我在尋找答案,而不MMI的過程,在一個(也許while(1)能做到這一點?)標準的Linux發行版,比如說帶有內核3.x的Ubuntu。

我的猜測是沒有等待時間。如果流程消失,系統會給它時間釋放其資源。否則,系統會殺死它。

+3

是否有一個特定的上下文,你問這個問題,如信號發送到關機進程?如果不是,那麼在TERM之後不一定會發送KILL。一個進程可以接收TERM,忽略它,並保持運行沒有問題。 – cobbal

+0

您是否嘗試過使用'time'命令來檢查'kill'命令 – Skynet

+0

@cobbal:我無法找到一個例子。假設我的程序阻止了操作系統,或者不處理SIGKILL信號。它在這方面更具相關性嗎?有時,MMI可以通過Windows中的「不響應」來阻止操作系統。我在Linux上尋找一個沒有MMI的類似案例。 – xhaltar

回答

7

比方說,例如,我創建一個問題,故意塊 從關閉操作系統(可能是一段時間(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的子進程。

相關問題