關(guān)機(jī)時(shí)間太長(zhǎng)的調(diào)查和解決的方法
我希望你對(duì) sigterm 和 sigkill 的概念有一點(diǎn)熟悉。
當(dāng)你 關(guān)閉 Linux 系統(tǒng) 時(shí),它會(huì)發(fā)送終止信號(hào)(sigterm),并禮貌地要求正在運(yùn)行的進(jìn)程停止。有些進(jìn)程不符合該行為,它們會(huì)忽略終止信號(hào)并繼續(xù)運(yùn)行。
這可能會(huì)導(dǎo)致關(guān)機(jī)過(guò)程的延遲,因?yàn)槟愕南到y(tǒng)會(huì)在一個(gè)預(yù)定義的時(shí)間段內(nèi)等待運(yùn)行的進(jìn)程停止。在這個(gè)時(shí)間段之后,它會(huì)發(fā)送 kill 信號(hào)來(lái)強(qiáng)制停止所有剩余的運(yùn)行進(jìn)程并關(guān)閉系統(tǒng)。
事實(shí)上,在某些情況下,你會(huì)在黑屏上看到一個(gè)類似 “a stop job is running” 的信息。
如果你的系統(tǒng)關(guān)閉時(shí)間太長(zhǎng),你可以做以下工作:
檢查哪個(gè)進(jìn)程/服務(wù)耗時(shí)過(guò)長(zhǎng),以及你是否能刪除或重新配置它,使其正常運(yùn)行。
更改系統(tǒng)強(qiáng)制停止運(yùn)行進(jìn)程前的默認(rèn)等待時(shí)間。(快速而不優(yōu)雅的方式)
我的操作系統(tǒng)是使用 systemd 的 Ubuntu。這里的命令和步驟適用于任何使用 systemd 的 Linux 發(fā)行版(大多數(shù)發(fā)行版都是這樣)。
檢查哪些進(jìn)程會(huì)導(dǎo)致 Linux 的長(zhǎng)時(shí)間關(guān)機(jī)
如果你想找出問(wèn)題所在,你應(yīng)該檢查上次關(guān)機(jī)時(shí)發(fā)生了什么。使用這個(gè)命令來(lái)獲得“我知道你上個(gè)會(huì)話做了什么”(I Know What You Did Last Summer 的雙關(guān)語(yǔ))的力量。
- journalctl -rb -1
journalctl 命令 能讓你讀取系統(tǒng)日志。使用選項(xiàng) -b -1 可以過(guò)濾最后一次啟動(dòng)會(huì)話的日志。使用選項(xiàng) -r 時(shí),日志將按時(shí)間倒序顯示。
換句話說(shuō),journalctl -rb -1 命令將顯示最后一次關(guān)閉 Linux 系統(tǒng)之前的系統(tǒng)日志。這里就是你需要分析 Linux 系統(tǒng)長(zhǎng)時(shí)間關(guān)機(jī)問(wèn)題的地方。
沒(méi)有 journal 日志?下面是你應(yīng)該做的。
如果沒(méi)有 journal 日志,請(qǐng)確認(rèn)你的發(fā)行版是否使用 systemd。
即使在一些使用 systemd 的 Linux 發(fā)行版上,journal 日志也沒(méi)有被默認(rèn)激活。
請(qǐng)確認(rèn) /var/log/journal 是否存在。如果不存在,請(qǐng)創(chuàng)建它:
- sudo mkdir /var/log/journal
你還應(yīng)該檢查 /etc/systemd/journald.conf 文件的內(nèi)容,并確保 Storage 的值被設(shè)置為自動(dòng)(auto)或持久(persistent)。
你是否在日志中發(fā)現(xiàn)可疑的東西?是否有一個(gè)進(jìn)程/服務(wù)拒絕停止?如果是,調(diào)查一下是否可以在沒(méi)有副作用的情況下刪除它,或者是否可以重新配置它。請(qǐng)不要在這里盲目地去刪除東西。你應(yīng)該對(duì)這個(gè)進(jìn)程有所了解。
通過(guò)減少默認(rèn)停止超時(shí)來(lái)加快 Linux 中的關(guān)機(jī)速度(快速修復(fù))
關(guān)機(jī)的默認(rèn)等待時(shí)間通常設(shè)置為 90 秒。在這個(gè)時(shí)間之后,你的系統(tǒng)會(huì)嘗試強(qiáng)制停止服務(wù)。
如果你想讓你的 Linux 系統(tǒng)快速關(guān)閉,你可以改變這個(gè)等待時(shí)間。
你可以在位于 /etc/systemd/system.conf 的配置文件中找到所有的 systemd 設(shè)置。這個(gè)文件中應(yīng)該有很多以 # 開(kāi)頭的行。它們代表了文件中各條目的默認(rèn)值。
在開(kāi)始之前,最好先復(fù)制一份原始文件。
- sudo cp /etc/systemd/system.conf /etc/systemd/system.conf.orig
在這里尋找 DefaultTimeoutStopSec。它可能被設(shè)置為 90 秒。
- #DefaultTimeoutStopSec=90s
你得把這個(gè)值改成更方便的,比如 5 秒或 10 秒。
- DefaultTimeoutStopSec=5s
如果你不知道如何在終端中編輯配置文件,可以使用這個(gè)命令在系統(tǒng)默認(rèn)的文本編輯器(如 Gedit)中打開(kāi)文件進(jìn)行編輯:
- sudo xdg-open /etc/systemd/system.conf
Change Shutdown Time Settings Ubuntu
不要忘記刪除 DefaultTimeoutStopSec 前的 # 號(hào)。保存文件并重啟系統(tǒng)。
這將幫助你減少 Linux 系統(tǒng)的關(guān)機(jī)延遲。
看門狗問(wèn)題!
Linux 有一個(gè)名為看門狗的模塊,用于監(jiān)控某些服務(wù)是否在運(yùn)行。它可以被配置為在系統(tǒng)因軟件錯(cuò)誤而掛起時(shí)自動(dòng)重啟系統(tǒng)。
在桌面系統(tǒng)上使用看門狗是不常見(jiàn)的,因?yàn)槟憧梢允謩?dòng)關(guān)閉或重啟系統(tǒng)。它經(jīng)常被用于遠(yuǎn)程服務(wù)器上。
首先檢查看門狗是否在運(yùn)行:
- ps -af | grep watch*
如果你的系統(tǒng)正在運(yùn)行看門狗,你可以在 systemd 配置文件 /etc/systemd/system.conf 中將 ShutdownWatchdogSec 的值從 10 分鐘改為更低的值。