✅ 一、前台运行(默认方式)
./myscript.sh
• 脚本会在 前台 运行,直到结束。
• 你必须等它跑完才能进行其他操作(除非用 & 或 Ctrl+Z)。
✅ 先复习两者作用:
关键词 | 作用 |
---|---|
& | 把任务 放到后台,但是它仍然依赖于当前终端,终端关闭则任务终止。 |
nohup | 忽略“挂起”信号,任务不受终端关闭影响,可以在后台或前台都使用。 |
✅ 场景 1:只加 &
(后台运行,但受终端控制)
./script.sh &
✅ 效果:
-
程序在后台运行,你可以继续操作终端。
-
一旦你关闭终端,任务就会被终止(因为默认会发送 SIGHUP 信号)。
✅ 使用场景:
-
你只是在一个临时终端里,想让程序在当前 session 后台执行一会儿,稍后会手动查看或等待它完成。
-
临时查看后台效果,不关心断开终端。
✅ 场景 2:只加 nohup
(抗挂起,但仍是前台运行)
nohup ./script.sh
✅ 效果:
-
程序在前台运行,但你关闭终端时,它不会被杀死。
-
输出默认会写入
nohup.out
文件。
✅ 使用场景:
-
你不需要手动管理后台,只是希望程序在你断开终端连接(如 SSH)后依然运行。
-
程序很快执行完,你不想留后台任务。
✅ 场景 3:nohup + &
(最常用组合)
nohup ./script.sh > out.log 2>&1 &
✅ 效果:
-
程序在后台运行,终端关闭后不会退出。
-
输出被重定向到日志文件中,任务独立、稳定。
✅ 使用场景:
-
部署长期运行的服务、定时任务、训练模型等。
-
生产环境首选写法,稳定、可控、安全。
🔍 你如果问:“到底加不加 nohup
,加不加 &
?”
是否长时间运行? | 是否要关终端? | 推荐写法 |
---|---|---|
否 | 否 | ./script.sh |
否 | 是 | nohup ./script.sh |
是 | 否 | ./script.sh & |
是 | 是 ✅推荐✅ | nohup ./script.sh & 或加日志 |
🧪 总结对比表
写法 | 后台运行 | 断开终端是否继续 | 日志重定向 | 推荐程度 |
---|---|---|---|---|
./script.sh & | ✅ | ❌(会挂掉) | ❌ | 一般 |
nohup ./script.sh | ❌(前台) | ✅ | 默认写到 nohup.out | 中等 |
nohup ./script.sh & | ✅ | ✅ | ✅(可指定) | ✅ 最推荐 |
nohup ./script.sh > log & | ✅ | ✅ | ✅ | ✅ 最推荐 |
后台程序的输出去哪了?我如何查看?
🧾 一、你是怎么启动后台程序的?对应查看方法如下:
✅ 1. 如果你使用的是:
nohup ./script.sh > out.log 2>&1 &
🟢 查看方式:
cat out.log # 查看全部输出
tail -f out.log # 实时查看日志(最常用)
less out.log # 分页查看(适合大文件)
✅ 2. 如果你使用的是:
nohup ./script.sh &
没有手动重定向输出时,默认输出到当前目录的
nohup.out
文件中
🟢 查看方式: tail -f nohup.out
cat nohup.out
tail -f nohup.out
✅ 3. 如果你使用的是:
./script.sh > out.log 2>&1 &
你没用
nohup
,终端关闭时程序会终止。但如果你只是用&
放到后台,终端还在,输出写到out.log
。
🟢 查看方式:
tail -f out.log
✅ 4. 如果你啥都没加,只是:
./script.sh
输出在终端屏幕上,终端关闭就没了,也不会保存。
🧰 二、如何找到正在运行的后台任务(确认它还在)?
ps aux | grep script.sh # 查找你的脚本是否还在
jobs -l # 查看你当前 shell 的后台任务(前提是没关终端)
🛑 三、终端关闭后,还能找回任务输出吗?
-
如果你没有用
nohup
或者没有重定向日志,终端一关,输出就丢了。 -
所以建议你:永远加上日志重定向
> out.log 2>&1
或者使用tee
命令保存到文件。
✨ 建议模板(推荐使用)
nohup ./script.sh > my.log 2>&1 &
然后用:
tail -f my.log