后台守护是什么
没有 systemd 权限或不想写单元文件时,让任务在后台常驻的标准做法是 nohup 加 setsid,再把标准输入与输出重定向到文件,并记录进程号便于后续停止。一条命令就要交代清楚三件事:在哪里运行、日志写到哪里、之后怎么停。
基本信息
| 场景 | 临时常驻任务(数据同步、爬虫、长跑批处理) |
|---|---|
| 组合 | nohup 加 setsid,配合重定向与进程号文件 |
| 关键点 | 脱离终端、日志可轮转、进程可精确停止 |
| 适用 | 无 systemd 权限或只是临时代跑的环境 |
典型使用场景
- 临时常驻任务:先让同步或计算脚本跑起来,之后再考虑纳入服务管理
- 受限环境:容器内或受限账户下无法写 systemd 单元文件
- 迁移窗口期:短期需要常驻,后续会改为正规服务
- 排障观察期:把输出落到文件,便于持续跟踪
- 与 systemd 并存:程序内部派生的子进程需要独立守护
标准启动方式
标准启动方式
cd /opt/app # 先切目录,避免相对路径依赖启动位置
nohup setsid ./worker.sh --mode sync </dev/null >> /var/log/worker.log 2>&1 &
echo $! > /run/worker.pid # 记录进程号,便于精确停止
cat /run/worker.pid; ps -p $(cat /run/worker.pid) -o pid,etime,cmd停止与核对
停止与核对
kill $(cat /run/worker.pid)
sleep 2; ps -p $(cat /run/worker.pid) || echo stopped
tail -n 20 /var/log/worker.log
rm -f /run/worker.pid启动要点
| 要点 | 做法 | 原因 |
|---|---|---|
| 脱离终端 | nohup 或 setsid | 终端关闭时不再收到挂断信号 |
| 关闭标准输入 | 重定向自空设备 | 避免后台进程读终端而阻塞 |
| 日志落地 | 重定向到文件并配轮转 | 否则日志会无限增长 |
| 记录进程号 | 写入 pid 文件 | 停止时不误杀同名进程 |
| 工作目录 | 启动前切换目录 | 相对路径依赖运行目录 |
nohup 只处理挂断信号,setsid 让进程进入新的会话彻底脱离终端,两者一起用更稳妥。
重定向用追加而不是覆盖:重启时用覆盖会清空历史日志,出问题时无法追溯上一次的运行情况。
更正规的路径是写 systemd 单元:失败自动拉起、输出统一交给日志系统、用 systemctl 统一启停,长期常驻的任务都值得这么做。