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

标签 linux service centos7 systemd

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

看完systemd.servicesystemd.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 上。

最佳答案

$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 行所做的那样)。

关于linux - 如何访问 ExecStop 或 ExecPostStop 中服务的返回码?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52110685/

相关文章:

service - 系统架构建议

mono - 无法使用 KestrelHttpServer 启动网站(错误 : Object reference not set to an instance of an object)

cross-compiling - 在 Centos 7 上交叉编译 Centos 6 系统

c - 在 C 中访问进程的 PCB

linux - grep 正则表达式

linux - shell 脚本如何确定文件是二进制文件还是文本文件?

linux - 用数据填充 shell 脚本数组

api - 使用服务模块远程登录 Drupal 7 站点

c# - 如何在 web.config 中引用 DLL?

docker - 阻止外部访问Docker容器