关键在于区分终端内调度(fg/bg/jobs)与抗断连运行(nohup),正确组合使用:前台启动可随时ctrl+z暂停→bg/fg切换;长期任务必用nohup+重定向日志,查状态用ps/pgrep而非jobs。

想让程序在终端关掉后还继续跑,又想随时切回去看进度?关键不在“能不能”,而在“怎么选”。fg、bg、jobs 是当前终端内的调度工具,nohup 才是真正扛住终端断开的保命手段。两者配合用对了,才不算白学。
先分清:哪些操作只管“当前终端”,哪些能扛“断网断盖”
这是最容易混淆的第一步:
- &:只是把命令丢进后台,不占终端——但关掉 SSH 或合上笔记本,进程立刻消失
- nohup:主动忽略 SIGHUP 信号——终端断了它也不退,但默认还在前台卡着你(除非加 &)
- Ctrl+Z → bg/fg:纯属当前 shell 会话内部切换,换一个终端就看不到这些作业,更别提断连后恢复
- jobs 只显示本终端启动并挂起/后台的作业,退出再登录就清空了
日常高频组合:先前台启动,再灵活调度
很多任务开始时你并不确定要跑多久。这时不用一上来就 nohup,可以边跑边决定:
- 运行中按 Ctrl+Z:暂停当前前台命令,返回提示符(比如正在 tail -f 日志)
- 执行 jobs:看到类似
[1]+ Stopped tail -f /var/log/syslog - 想让它静默跑:输入 bg %1,进程继续执行但不再刷屏
- 想临时回来看输出:输入 fg %1,立刻回到前台实时观察
真正要“放养”的任务:nohup + 完整重定向
一旦确认任务要长期运行(如模型训练、数据同步),必须用 nohup,并且别偷懒:
- 错误写法:
nohup python train.py &→ 输出全堆进 nohup.out,日志混杂难排查 - 推荐写法:
nohup python train.py > train.log 2>&1 & - 说明:
> train.log把 stdout 写入指定文件;2>&1把 stderr 合并进去;末尾&确保它真在后台 - 补充:如果担心日志过大,可配合 logrotate 或用
nohup python train.py | tee train.log &边存边看
查状态、杀任务:别只靠 jobs
jobs 只告诉你“本终端有哪些作业”,但生产环境里,你更常需要:
- 确认进程是否真在跑:
ps aux | grep train.py或pgrep -f "train.py" - 看它写了什么日志:
tail -n 20 train.log(注意不是 nohup.out) - 安全终止:
kill %1(针对作业号)或kill $(pgrep -f "train.py")(更可靠) - 强制终止:
kill -9仅在进程无响应时用,避免残留锁或未刷盘数据











