首页/系统/Linux 运维命令速查/场景:后台任务守护与日志
进程与作业69 条

场景:后台任务守护与日志

没有 systemd 权限时的标准后台化组合:nohup + setsid + 重定向 + pidfile,一条命令交代清楚「在哪跑、日志在哪、怎么停」。

Linux 运维命令速查系统更新于 2026-10-13

后台守护是什么

没有 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 统一启停,长期常驻的任务都值得这么做。

易错点

  • 重定向用覆盖会清空历史日志,排查上次崩溃原因时无从查起
  • 进程崩溃后 nohup 不会自动拉起,需要自己写检测脚本或改用 systemd 的自动重启
  • 不记录进程号只按名字停止会误杀同名进程,脚本里必须用 pid 文件定位
  • 启动前没切到正确的工作目录,程序读不到相对路径下的配置,表现为起来就退出

数据来源与参考

  • man 1 nohup(GNU coreutils 手册)

相关工具

​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌