2016-08-23 3 views
2

Короткая версия:Systemd блок, проверить состояние с внешним скриптом

У меня есть Systemd блок, который я хочу, чтобы проверить код возврата сценария, когда я называю:

systemctl status service.service

Long version: У меня был сценарий инициализации lsb, который сделал именно это, когда статус был передан как параметр, он называл скрипт, который проверял состояние нескольких процессов и на основе кода возврата система init корректно возвращала состояние программного обеспечения.

Теперь при адаптации сценария к systemd я не могу узнать, как настроить это поведение.

ответ

3

Короткий ответ

Это невозможно в systemd. Глагол systemctl status всегда делает то же самое, его нельзя переопределить на единицу для пользовательского действия.

Длинного ответ

Вы можете написать foo-status.service единичный файл в с Type=oneshot и ExecStart=, указывающими на ваш сценарий хСтатуса, а затем запустить systemctl start foo-status. Однако это даст только нулевую/ненулевую информацию (любой ненулевой код выхода будет преобразован в 1).

Чтобы получить реальный код выхода вашего сценария статуса, запустите systemctl show -pExecMainStatus foo-status, однако, если вы заходите так далеко, проще запустить скрипт напрямую.

0

Если вы контролируете код службы, который вы запускаете/останавливаете таким образом, вы можете легко отредактировать ее и сохранить результат в файле.

В противном случае вы всегда можете добавить обертку, которая сделает это за вас.

#!/bin/sh 
/path/to/service and args here 
echo $? >/run/service.result 

Тогда ваш статус можно получить, используя содержимое этого файла:

STATUS=`cat /run/service.result` 
if test $STATUS = 1 
then 
    echo "An error occurred..." 
fi 

(Примечание стороны:. /run/ перезаписывает только корень, используйте /tmp/, если вы не корень)