Ubuntu

systemd 退出程式碼 EXIT_FDS 是什麼意思?

  • June 15, 2022

systemd status我停止服務後收到此消息:

Actice: failed (Result: exit-code) <...> Main PID: 4747 (code=exited, status=202/FDS)

狀態 FDS 在文件中定義如下:

202 EXIT_FDS 無法關閉不需要的文件描述符,或調整傳遞的文件描述符。

啟動服務正常,沒有錯誤報告systemd status

問題

  1. EXIT_FDS 更具體的含義是什麼?
  2. 狀態碼是來自我的應用程序還是來自 systemd 本身?
  3. 我的應用程序打開一個 TCP 套接字,它在停止時不會關閉。是這個原因嗎?
  4. 如果是這樣,我可以讓 systemd 忽略延遲套接字而不將其報告為錯誤嗎?

細節

完整的狀態消息:

tool-user@tool-box:~$ systemctl status tool.service
● tool.service - Tool application
  Loaded: loaded (/home/tool-user/tool.service; linked; vendor preset: enabled)
  Active: failed (Result: exit-code) since Mon 2022-02-07 14:14:46 CET; 3s ago
 Process: 4758 ExecStop=/bin/bash -c tool-stop && while ps -p $MAINPID >/dev/null
 Process: 4601 ExecStart=/bin/bash -c tool-start (code=exited, status=0/SUCCESS)
Main PID: 4747 (code=exited, status=202/FDS)

Feb 07 14:14:31 tool-box systemd[1]: Starting Tool application...
Feb 07 14:14:32 tool-box bash[4601]: Server started on port 44680
Feb 07 14:14:32 tool-box systemd[1]: Started Tool application.
Feb 07 14:14:44 tool-box systemd[1]: Stopping Tool application...
Feb 07 14:14:45 tool-box systemd[1]: tool.service: Main process exited, code=exited, status=202/FDS
Feb 07 14:14:46 tool-box systemd[1]: tool.service: Failed with result 'exit-code'.
Feb 07 14:14:46 tool-box systemd[1]: Stopped Tool application.

服務定義文件如下所示:

[Unit]
Description=Tool application
# Standard dependencies for web server
After=network.target remote-fs.target nss-lookup.target httpd-init.service

[Service]
Type=forking
Restart=on-failure
RestartSec=10
ExecStart=/bin/bash -c 'toolStart'
ExecStop=/bin/bash -c 'toolStop && while ps -p $MAINPID >/dev/null 2>&1; do sleep 1; done'
User=tool-user
StandardOutput=syslog
StandardError=syslog
TimeoutStopSec=60

[Install]
WantedBy=multi-user.target

作業系統:Ubuntu 18.04 伺服器,在 Windows 10 上的 VirtualBox 中執行。

tool-user@tool-box:~$ uname -a
Linux tool-box 4.15.0-166-generic #174-Ubuntu SMP Wed Dec 8 19:07:44 UTC 2021 x86_64 x86_64 x86_64 GNU/Linux

由於該服務具有PID 4758 Type=forkingExecStart並且您要詢問的退出程式碼與主 PID 4747 一起列出,因此我們可以得出結論,它systemd管理了fork()一個子程序,該子程序然後成功地execve()執行了 ExecStart 程序,因此 systemd 表- 特定的退出程式碼不適用於此處。

systemd如果錯誤來自實際的子程序,fork()則將應用特定於 systemd 的退出程式碼表execve():具體而言,錯誤 202 將意味著例如在服務定義中實現StandardInput=StandardOutput=StandardError=指令時出現問題。但由於ExecStart特別報告 PID 4601 並以 退出status=0/SUCCESS,這不是這裡發生的情況。被ExecStop執行為 PID 4758,所以它也不是來自那個。

狀態碼 202 來自應用程序的“主程序”(PID 為 4747 的那個),它表示應用程序開發人員想要的任何含義。

延遲的 TCP 套接字不是原因:由於您的應用程序程序死亡,核心將清除它可能擁有的任何延遲的套接字。

當然,如果應用程序沒有使用 SO_REUSEADDR 套接字選項,則可能無法立即重新啟動應用程序並讓它使用相同的埠號,直到延遲套接字的 TIME_WAIT 過期……但這不是 systemd 的問題;這是應用程序必須自己處理的事情。

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