在Linux系统中,nohup命令的核心作用是让程序忽略终端的挂断信号,即使启动程序的终端被关闭,对应的进程依然可以继续在后台运行,非常适合需要长时间执行的任务场景。

nohup命令基本语法
nohup命令的基础语法格式如下:
nohup [命令] [参数] [> 输出文件] 2>&1 &
其中各个部分的含义如下:
- nohup:命令本身,用于忽略挂断信号
- [命令] [参数]:需要后台运行的程序及其参数
- > 输出文件:可选,用于将标准输出重定向到指定文件,如果不指定默认会输出到当前目录的nohup.out文件
- 2>&1:可选,将标准错误输出合并到标准输出中,一起写入指定的输出文件
- &:将命令放到后台执行
常用使用场景示例
场景1:运行脚本并保存输出
假设我们有一个需要长时间运行的Python脚本test.py,希望它在后台运行,并且把输出保存到run.log文件中,可以使用以下命令:
nohup python3 test.py > run.log 2>&1 &
执行后终端会返回一个进程ID,这个ID就是后台运行的nohup进程的PID,后续可以用这个ID来管理进程。
场景2:运行系统命令
如果需要后台执行一个持续的数据同步命令,比如用rsync同步文件,命令如下:
nohup rsync -av /data/local/ /data/remote/ > rsync.log 2>&1 &
进程管理与查看
使用nohup启动后台进程后,我们可以通过以下方式查看和管理进程:
查看进程状态
可以通过ps命令结合进程名或者PID来查看进程是否在运行:
# 根据进程名查看 ps -ef | grep test.py # 根据PID查看 ps -p 12345
终止nohup进程
如果需要停止后台运行的nohup进程,直接使用kill命令加上对应的PID即可:
kill 12345 # 如果进程无法终止,可以使用强制终止命令 kill -9 12345
常见问题说明
- 如果没有指定输出重定向文件,nohup默认会把输出写入当前目录的
nohup.out文件,如果这个文件不可写,会尝试写入$HOME/nohup.out,如果还是不可写,命令会执行失败。 - nohup只能忽略挂断信号,无法让进程脱离终端的原有会话,如果需要更彻底的进程脱离,可以结合
setsid命令使用。 - 如果程序本身有交互逻辑,使用nohup后台运行可能会出现异常,因为后台运行无法接收终端的输入。
与&符号的区别
很多用户会混淆nohup和&的作用,两者的区别如下:
| 对比项 | nohup | & |
|---|---|---|
| 核心作用 | 忽略终端挂断信号,终端关闭进程继续运行 | 将命令放到后台执行,终端关闭进程会终止 |
| 输出处理 | 默认输出到nohup.out,可自定义重定向 | 输出默认还是关联到当前终端 |
| 适用场景 | 需要长时间运行、终端关闭后仍需保留的进程 | 临时后台执行、不需要持久化的任务 |
实际使用中,通常会把nohup和&结合使用,既实现后台运行,又保证终端关闭后进程不中断。