是否有可能从正在运行的进程中捕获退出代码,例如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]
所以什么都没有。我目前在Centos7上遇到了systemd 219
(+ PAM + AUDIT + SELINUX + IMA -APPARMOR + SMACK + SYSVINIT + UTMP + LIBCRYPTSETUP + GCRYPT + GNUTLS + ACL + XZ -LZ4 -SECCOMP + BLKID + ELFUTILS + KMOD + IDN)。
$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替代。要检查实际过程的环境,请使用shell(如上所述)或env
之类的命令(就像你为其中一个ExecStop
行所做的那样)。