如何更改 systemd 服務超時值?
在我現在工作的公司中,有一個遺留服務,它的 init 腳本使用舊的 SysvInit,但在 systemd (CentOS 7) 上執行。
由於計算量很大,因此該服務大約需要 70 秒才能完成。我沒有為 systemd 配置任何超時,也沒有更改預設配置
/etc/systemd/system.conf
,但是當我執行service SERVICE stop
我的服務時,60 秒後仍然超時。檢查
journalctl -b -u SERVICE.service
我發現這個日誌:Sep 02 11:27:46 service.hostname systemd[1]: Stopping LSB: Start/Stop Sep 02 11:28:46 service.hostname SERVICE[24151]: Stopping service: Error code: 255 Sep 02 11:28:46 service.hostname SERVICE[24151]: [FAILED]
我已經嘗試將
DefaultTimeoutStopSec
屬性更改為/etc/systemd/system.conf
to90s
,但仍然會發生超時。有誰知道為什麼它會在 60 秒時超時?是否在其他地方配置了此超時值?有什麼方法可以檢查嗎?
該服務使用 java 7 執行並對其進行守護,它使用JSVC。我
-wait
用 value 配置了參數120
。
由於啟動也需要多長時間,我的 systemd 服務一直超時,所以這為我修復了它:
- 編輯您的 systemd 文件:
對於現代版本
systemd
:執行**systemctl edit --full node.service
**(將“節點”替換為您的服務名稱)。
- 這將創建一個系統文件,
/etc/systemd/system/node.service.d/
該文件將覆蓋系統文件/usr/lib/systemd/system/node.service
。這是配置系統文件的正確方法。更多關於如何使用systemctl edit
的資訊在這裡。直接編輯系統文件:我的系統文件在
/usr/lib/systemd/system/node.service
. 將“node”替換為您的應用程序名稱。但是,直接編輯文件是不安全的/usr/lib/systemd/
(見評論)
- 使用
TimeoutStartSec
,TimeoutStopSec
或TimeoutSec
(更多資訊here)指定啟動和停止程序的超時時間。之後,這就是我的 systemd 文件的樣子:[Unit] Description=MyProject Documentation=man:node(1) After=rc-local.service [Service] WorkingDirectory=/home/myproject/GUIServer/Server/ Environment="NODE_PATH=/usr/lib/node_modules" ExecStart=-/usr/bin/node Index.js Type=simple Restart=always KillMode=process TimeoutSec=900 [Install] WantedBy=multi-user.target
您還可以通過執行其中任何一個來查看目前的超時狀態(但您需要編輯您的服務以進行更改!請參閱步驟 1)。令人困惑的是,相關屬性的名稱中有一個“U”表示微秒。有關更多資訊,請參閱此 Github 問題:
systemctl show node.service -p TimeoutStartUSec
systemctl show node.service -p TimeoutStopUSec
systemctl show node.service -p TimeoutUSec
- 接下來你需要重新載入systemd**
systemctl reload node.service
**- 現在嘗試使用**
systemctl start node.service
**- 如果這不起作用,請嘗試重新啟動 systemctl**
systemctl reboot
**- 如果這不起作用,請嘗試使用
--no-block
systemctl 的選項,如下所示**systemctl --no-block start node.service
**:此選項在此處描述:“不要同步等待請求的操作完成。如果未指定,則將驗證作業,排隊並且 systemctl 將等待直到單元的啟動完成。通過傳遞此參數,它僅經過驗證和排隊。”
- 也可以選擇使用
systemctl mask
而不是systemctl start
. 有關更多資訊,請參見此處。來自評論的更新:
TimeoutSec=infinity
:這裡不要使用“無窮大”,而是使用大量時間,例如TimeoutSec=900
(15 分鐘)。如果應用程序“永遠”退出,那麼它可能會無限期地阻止重新啟動。信用@Alexis Wilke 和@JCCyC- 而不是編輯
/usr/lib/systemd/system
,而是嘗試systemctl edit
或編輯/etc/systemd/system
以覆蓋它們。您永遠不應該在/usr/lib/
. 信用@ryeager 和@0xC0000022L** 從 systemd 源文件更新 ** 當指定“無窮大”作為任何這些超時參數的值時,超時邏輯被禁用。
JobTimeoutSec=, JobRunningTimeoutSec=,TimeoutStartSec=, TimeoutAbortSec=
預設值為“infinity”(禁用作業超時),但 JobRunningTimeoutSec= 預設為 DefaultTimeoutStartSec= 的設備單元除外。
參考:在此處輸入連結描述
同樣,此邏輯適用於服務級別,並在下面的 URL 中明確列出。參考:在此處輸入連結描述