我注意到在 Fedora 17 中,關閉操作(例如 shutdown -h now)變得更快(感覺最多 2 秒)。所以我想知道正在運行的進程是否正確終止?特別是在 Fedora 上(同樣,大約 2 秒),我很難想像每個進程都有足夠的時間來完成。
我假設在發出關閉命令之前,每個用戶進程都已被用戶(手動)關閉,因此只剩下系統服務(不過,這些服務在退出時也可能有要做的事情)。
因此,我編寫了一個小程序,它可以捕獲大多數訊號,如果提供了一定數量(秒),它會在退出之前等待。除此之外,它沒有做任何事。然後 - 首先在 Debian 系統上 - 我延遲了 60 秒啟動了它。當它收到 SIGHUP 訊號時(我假設它的父 shell 已終止),它開始 60 秒倒數。 10 秒後,它收到一個友好的 SIGTERM。我的程式忽略了這個訊號並繼續倒數計時 - 直到第 40 秒它不幸死掉了。因此,在被告知終止 (SIGHUP) 20 秒後,它被 SIGKILLed。
現在在 Fedora 17 (3.5.3-1.fc17.x86_64) 上進行相同的測試:
捕獲訊號 1
。 59... 58...
在 SIGHUP 發出後不到一秒,它就收到了 SIGTERM。程式設計師可能會在 SIGTERM 後延遲其程式的終止,以便完成作業、儲存設定等(與 SIGINT 後可能不同)。我的程式在被殺死前有 2 秒的時間。
如果正在保存某些設定(損壞的設定檔?)或某種守護進程(例如,某些檔案伺服器)正在將快取資料寫入磁碟(損壞的資料?)時終止正在運行的進程,該怎麼辦?
答案1
服務可以在其文件中指定它們希望如何終止*.service
。您可以選擇任何您想要的超時,不必接受預設值。如果您安裝了 postgreSQL 或 mysqld,請查看它們的服務檔案以了解它們如何安排乾淨關閉。