Linux 如何访问ExecStop或ExecPostStop中服务的返回码?

Linux 如何访问ExecStop或ExecPostStop中服务的返回码?,linux,service,centos7,systemd,Linux,Service,Centos7,Systemd,是否可以从运行在上的进程捕获退出代码,例如系统服务单元中的ExecStart?我想检查进程是否正常退出,或者是否发生错误 在阅读了和文档之后,我认为$SERVICE\u RESULT$EXIT\u code和/或$EXIT\u STATUS可能会有所帮助。但是没有用 给定此测试单元: [Unit] Description=Testing Run Order [Service] Type=simple Environment=HELLO=WORLD ExecStartPre=/bin/echo

是否可以从运行在上的进程捕获退出代码,例如系统服务单元中的
ExecStart
?我想检查进程是否正常退出,或者是否发生错误

在阅读了和文档之后,我认为
$SERVICE\u RESULT
$EXIT\u code
和/或
$EXIT\u 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]

没什么。我目前在Centos7上使用了
Systemd219
(+PAM+AUDIT+SELINUX+IMA-APPARMOR+SMACK+SYSVINIT+UTMP+LIBCRYPTSETUP+GCRYPT+GNUTLS+ACL+XZ-LZ4-SECCOMP+BLKID+ELFUTILS+KMOD+IDN)。

$EXIT\u code
$EXIT\u STATUS
仅添加到SystemdV232中。如果您坚持使用较旧的版本,您将不得不解决它,可能需要使用类似以下内容(未经测试):

旁注:当你写下这样的东西时

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

在您的测试单元中,这些变量由systemd替换。要检查实际进程的环境,请使用shell(如上所述)或类似于
env
的命令(就像您对
ExecStop
行之一所做的那样)。

您实际上可以从命令
systemctl show your_service--property=ExecMainStatus

例如,如果要根据结果触发命令(正常停止或硬崩溃),可以使用以下方法:

ExecStopPost=/bin/bash-c“如果[$(systemctl显示您的_服务--property=ExecMainStatus)='ExecMainStatus=143'];则退出;否则/bin/bash-c'/usr/local/bin/your_custom_program.sh';fi”

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