Linux

腳本處理 systemd 服務的返回碼

  • December 14, 2017

我正在編寫一個可以使用 systemctl 命令啟動或停止的 systemd 服務。

然而,這個程序也可以返回幾個返回碼,我想處理這些返回碼。

例如,如果服務被停止,systemctl stop <service>它應該什麼都不做。但是,如果它沒有被 systemctl 殺死並自行返回,我想執行一個 post 腳本,我可以在該腳本上獲取返回碼並根據其值執行操作。


在@NarūnasK 回答之後修改

當系統版本 >= v232 時,@NarūnasK 回答沒問題


但是,當沒有好的 systemd 版本時,怎麼辦?

我雖然關於做類似的事情

ExecStart=/bin/sh -c '<service> -C /etc/<service_conf_file>; [ $? -eq 1 ] && { <action> }'

ExecStopPost=應該做你想做的事。

服務停止後執行的附加命令。這包括使用 ExecStop= 中配置的命令、服務未定義任何 ExecStop= 或服務意外退出的情況。此參數採用多個命令行,遵循與 ExecStart= 描述的相同方案。使用這些設置是可選的。支持說明符和環境變數替換。請注意 - 與 ExecStop= 不同 - 使用此設置指定的命令在服務無法正確啟動並再次關閉時被呼叫。

建議將此設置用於即使服務無法正確啟動也應執行的清理操作。使用此設置配置的命令需要能夠執行,即使服務中途啟動失敗並留下未完全初始化的數據。由於在執行使用此設置指定的命令時服務的程序已經終止,因此它們不應嘗試與它們通信。

請注意,使用此設置配置的所有命令都使用服務的結果程式碼以及主程序的退出程式碼和狀態呼叫,設置在 $ SERVICE_RESULT, $ EXIT_CODE 和 $EXIT_STATUS 環境變數,詳見 systemd.exec(5)。

在您的腳本中,您可以讀取$EXIT_CODE$EXIT_STATUS環境變數並採取適當的措施。

編輯

您可以將以下解決方法與systemd < 232.

範例腳本

#! /bin/bash --

sleep 5

## Non standard exit code
exit 255

退出處理程序

#! /bin/bash --

CODE="${1:-N/A}"

echo CODE: $CODE
echo SERVICE_RESULT: $SERVICE_RESULT
echo EXIT_CODE: $EXIT_CODE
echo EXIT_STATUS: $EXIT_STATUS

範例腳本服務

# systemctl cat sample_script.service 
# /etc/systemd/system/sample_script.service
[Unit]
Description=My service
After=network.target rsyslog.service

[Service]
Type=simple
Restart=never
ExecStart=/bin/bash -c '/tmp/sample_script || /tmp/exit_handler $?'
ExecStopPost=/tmp/exit_handler

[Install]
WantedBy=multi-user.target

sample_script.service的狀態:

# systemctl status sample_script.service 
● sample_script.service - My service
  Loaded: loaded (/etc/systemd/system/sample_script.service; enabled)
  Active: inactive (dead) since Thu 2017-12-14 12:29:16 GMT; 7s ago
 Process: 16511 ExecStopPost=/tmp/exit_handler (code=exited, status=0/SUCCESS)
 Process: 16505 ExecStart=/bin/bash -c /tmp/sample_script || /tmp/exit_handler $? (code=exited, status=0/SUCCESS)
Main PID: 16505 (code=exited, status=0/SUCCESS)

Dec 14 12:29:11 build-local systemd[1]: Started My service.
Dec 14 12:29:16 build-local bash[16505]: CODE: 255
Dec 14 12:29:16 build-local bash[16505]: SERVICE_RESULT:
Dec 14 12:29:16 build-local bash[16505]: EXIT_CODE:
Dec 14 12:29:16 build-local bash[16505]: EXIT_STATUS:
Dec 14 12:29:16 build-local exit_handler[16511]: CODE: N/A
Dec 14 12:29:16 build-local exit_handler[16511]: SERVICE_RESULT:
Dec 14 12:29:16 build-local exit_handler[16511]: EXIT_CODE:
Dec 14 12:29:16 build-local exit_handler[16511]: EXIT_STATUS:

你可以看到它exit_handler被呼叫了兩次。首先,它從bash那裡提供了退出程式碼,然後作為ExecStopPost=腳本,沒有提供退出程式碼的位置參數,因此它列印 N/A。

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