Centos

如何更改 systemd 服務超時值?

  • February 27, 2022

在我現在工作的公司中,有一個遺留服務,它的 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.confto 90s,但仍然會發生超時。

有誰知道為什麼它會在 60 秒時超時?是否在其他地方配置了此超時值?有什麼方法可以檢查嗎?

該服務使用 java 7 執行並對其進行守護,它使用JSVC。我-wait用 value 配置了參數120

由於啟動也需要多長時間,我的 systemd 服務一直超時,所以這為我修復了它:

  1. 編輯您的 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/(見評論)

  1. 使用TimeoutStartSec,TimeoutStopSecTimeoutSec(更多資訊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
  1. 接下來你需要重新載入systemd**systemctl reload node.service**
  2. 現在嘗試使用**systemctl start node.service**
  3. 如果這不起作用,請嘗試重新啟動 systemctl**systemctl reboot**
  4. 如果這不起作用,請嘗試使用--no-blocksystemctl 的選項,如下所示**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 中明確列出。參考:在此處輸入連結描述

引用自:https://unix.stackexchange.com/questions/227017