Как я могу получить доступ к коду возврата службы в ExecStop или ExecPostStop? - PullRequest
0 голосов
/ 31 августа 2018

Возможно ли захватить код выхода из запущенного процесса, например, ExecStart в системном сервисном блоке ? Я хочу проверить, нормально ли завершился процесс или произошла ошибка.

После прочтения документов systemd.service и systemd.exec я подумал, что $SERVICE_RESULT $EXIT_CODE и / или $EXIT_STATUS могут помочь. Но безрезультатно.

Данный тестовый блок:

[Unit]
Description=Testing Run Order

[Service]
Type=simple
Environment=HELLO=WORLD
ExecStartPre=/bin/echo [StartPre] $MAINPID $SERVICE_RESULT $EXIT_CODE $EXIT_STATUS
ExecStartPost=/bin/echo [StartPost] $MAINPID $SERVICE_RESULT $EXIT_CODE $EXIT_STATUS
ExecStart=/bin/sleep 2
ExecStop=/bin/env
ExecStop=/bin/echo [Stop] $MAINPID $SERVICE_RESULT $EXIT_CODE $EXIT_STATUS
ExecStopPost=/bin/echo [StopPost] $MAINPID $SERVICE_RESULT $EXIT_CODE $EXIT_STATUS

Я получаю следующий вывод:

Aug 30 08:37:26 localhost.localdomain systemd[1]: Starting Testing Run Order...
Aug 30 08:37:26 localhost.localdomain echo[3458]: [StartPre]
Aug 30 08:37:26 localhost.localdomain systemd[1]: Started Testing service metrics.
Aug 30 08:37:26 localhost.localdomain echo[3460]: [StartPost] 3459
Aug 30 08:37:27 localhost.localdomain env[3465]: LANG=en_US.UTF-8
Aug 30 08:37:27 localhost.localdomain env[3465]: PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin
Aug 30 08:37:27 localhost.localdomain env[3465]: HELLO=WORLD
Aug 30 08:37:27 localhost.localdomain echo[3467]: [Stop]
Aug 30 08:37:27 localhost.localdomain echo[3469]: [StopPost]

Так ничего. В настоящее время я застрял с systemd 219 (+ PAM + AUDIT + SELINUX + IMA -APPARMOR + SMACK + SYSVINIT + UTMP + LIBCRYPTSETUP + GCRYPT + GNUTLS + ACL + XZ -LZ4 -SECCOMP + BLKID + ELFUTILS + KMOD + IDN) в Centos7.

1 Ответ

0 голосов
/ 31 августа 2018

$EXIT_CODE и $EXIT_STATUS были добавлены только в systemd v232. Если вы застряли с более старой версией, вам придется обойти ее, возможно, с чем-то вроде этого (не проверено):

ExitStart=/bin/sh -c '/* normal command goes here */; echo $? > /tmp/my-service.exit'
ExecStopPost=/bin/sh -c 'EXIT_STATUS=$(cat /tmp/my-service.exit); /* rest of command goes here */'

Примечание: когда вы пишете что-то вроде

ExecStop=/bin/echo [Stop] $MAINPID $SERVICE_RESULT $EXIT_CODE $EXIT_STATUS

в вашем тестовом блоке эти переменные заменены на systemd. Чтобы проверить среду реального процесса, используйте оболочку (как указано выше) или команду, подобную env (как вы делали для одной из ExecStop строк).

...