监控后台任务退出状态码需主动捕获或持久化:①用wait配合$?实时获取;②日志固化记录EXIT:$?及时间戳;③状态文件标记(.running/.done/.failed);④systemd服务查status或journalctl;⑤OOM需查dmesg。

监控后台任务的退出状态码,关键在于不让状态丢失——因为后台进程(如用 & 启动)结束后,其退出码不会自动保留在父 shell 的 $? 中,必须主动捕获或持久化。
直接捕获:用 wait + $? 配合子 shell 或 job 控制
若任务是当前 shell 启动的后台作业(非 daemon),可用 wait 等待并读取其退出码:
- 启动时记录 job ID:
sleep 2 && exit 42 & echo $! - 用
wait %1或wait $PID阻塞等待,之后立即执行echo $?获取退出码 - 注意:
$?只在wait返回后有效,且仅反映该次wait对应进程的状态
日志固化:重定向输出并显式记录退出码
对 cron 或长期运行的脚本,靠交互式 wait 不现实,应把退出码写入日志:
- 在命令末尾追加:
/path/to/script.sh >> /var/log/job.log 2>&1; echo "EXIT:$?" >> /var/log/job.log - 脚本内部也建议用
set -e或手动检查关键命令返回值,失败时exit 1等明确码值 - 日志中保留时间戳(如
date '+%Y-%m-%d %H:%M:%S')便于关联执行上下文
状态文件标记:适用于防重跑、超时检测等场景
用轻量文件作为“执行快照”,比解析日志更可靠:
- 任务开始:
touch /tmp/.job_backup.running - 成功结束:
mv /tmp/.job_backup.running /tmp/.job_backup.done.$(date +%Y%m%d) - 失败时:
echo "FAIL: $?" > /tmp/.job_backup.failed.$(date +%Y%m%d) - 独立监控脚本定期扫描:
ls -t /tmp/.job_*.done* | head -n1判断是否最新;find /tmp -name "*.running" -mmin +30检查超时
系统级服务:查 systemd 单元的退出码与信号
如果是 systemctl start 启动的服务,退出码由 systemd 统一捕获:
- 运行
systemctl status your-service,看 “Process exited with code” 或 “Killed by signal” - 用
journalctl -u your-service -n 20 -o cat查最近日志,确认是exit(1)还是被SIGKILL终止 - 特别注意 OOM Killer 杀进程不会走正常退出流程,需查
dmesg -T | grep "killed process"











