## 三种跑法的区别
直接在命令行跑脚本,SSH 会话断开它就没了:会话退出时终端向子进程发送挂断信号,默认行为是终止。三种续命方式各有分工:与号把命令放到后台,当前会话里继续干别的,但会话断了照样被信号带走;nohup 让命令对挂断信号免疫,会话退出后继续跑,输出默认落到 nohup.out;setsid 换个会话组运行,彻底脱离终端关联。组合 nohup 与 & 是最常用的形态,兼顾后台与断线存活。
## 标准用法
bash nohup /opt/scripts/import.sh > /var/log/import.log 2>&1 &
拆开看:nohup 挂免疫,& 放后台,重定向把标准输出与错误一并收进日志,不指定重定向则写 nohup.out,多任务同目录会互相覆盖。执行后回显一个进程号,记下来或者立刻补一步确认。退出 SSH 重连,用 ps 确认进程还活着,任务就真正独立了。jobs 命令列出当前 shell 的后台任务,fg 加编号能把任务调回前台交互,批处理场景之外偶尔也用得上。日常跑数据导入、批量转换这类几小时的活,这条命令是保底手段。
## 确认存活与收尾
后台任务的黑盒状态要主动看。确认存活:
bash ps -p 进程号 -o pid,etime,cmd
看进度三种方式:日志 tail 跟随;目标产物目录 du 看体积增长;对支持进度输出的任务直接读它的状态文件。任务该跑两小时的,二十分钟就没影了,八成是中途报错退出,日志里找原因;反过来一直不结束,也要怀疑它卡死在某个等待上。收尾要干净:任务完成后清理临时文件,把结果与日志归档,别留一堆孤儿进程占资源。需要中途终止时,先 kill 进程号温和通知,卡死不退再加强制信号。
## 与专业工具的分工
nohup 适合一次性、可接受中断重跑的任务。对要求更高的场景有更合适的工具:终端会话要交互查看,用 tmux 或 screen,断线重连现场还在;服务类进程要开机自启、崩溃自动拉起,写 systemd 服务单元;定时任务交给 crontab。顺云云服务器上跑长任务,判断标准就一条:这个任务中断的代价多大,代价大就升级工具,nohup 只是最轻量的兜底。