获取通过startx启动的应用程序的退出码
解决Debian信息亭模式下systemd服务捕获myapp退出码的问题
当前你的systemd服务获取的是startx的退出码而非myapp的,核心原因是startx默认返回自身进程的退出码,而非它启动的客户端程序的。以下是两种可行的解决方法:
方法一:修改看门狗脚本传递退出码
- 编辑
/opt/myapp-watchdog.sh,确保脚本执行myapp后以其退出码终止:
#!/bin/bash # 执行目标应用并捕获退出码 /opt/myapp APP_EXIT_CODE=$? # 可添加额外看门狗逻辑(如日志记录) # echo "myapp exited with code $APP_EXIT_CODE" >> /var/log/myapp-watchdog.log # 以myapp的退出码结束脚本 exit $APP_EXIT_CODE
- 给脚本添加可执行权限:
chmod +x /opt/myapp-watchdog.sh
- 修改systemd服务的
ExecStart行,确保su传递脚本的退出码:
ExecStart=su user -c 'startx /opt/myapp-watchdog.sh -- :0 vt7; exit $?'
使用单引号避免shell转义问题,让$?能正确捕获脚本的退出码。
方法二:直接使用xinit替代startx
startx是xinit的封装脚本,可能干扰退出码传递。直接用xinit可更可靠获取客户端程序的退出码:
修改systemd服务的ExecStart为:
ExecStart=su user -c 'xinit /opt/myapp-watchdog.sh -- :0 vt7'
xinit默认返回最后启动的客户端程序的退出码,这样systemd就能直接获取myapp的退出状态,Restart=on-failure会基于myapp的退出码触发重启。
额外注意事项
- 确保
user用户拥有/opt/myapp和/opt/myapp-watchdog.sh的执行权限。 - 可通过
journalctl -u your-service-name.service查看服务日志,验证退出码是否正确传递。 - 当前服务中
XAUTHORITY等环境变量已配置,可保证图形应用的权限正常。
内容的提问来源于stack exchange,提问作者George Tuzikov
相关产品推荐
相关产品推荐

