在 linux 中,nohup 和 & 的主要区别在于对 sighup 信号的处理;1. & 是将程序放在后台运行,但关闭终端时进程会因收到 sighup 信号而退出;2. nohup 则会忽略 sighup 信号,确保程序即使在终端关闭后仍持续运行;3. 使用 nohup 时默认输出会被重定向至 nohup.out 文件,也可自定义输出文件;4. 若需长时间运行程序应使用 nohup,若仅需临时后台运行则可用 &;5. nohup 程序仍可能因内存不足、磁盘空间不足或被其他进程终止而退出;6. 可通过 ps 或 top 命令查看后台进程;7. 使用 kill 命令加 pid 可停止对应进程,无响应时可加 -9 强制终止。

Linux中,想让程序在后台默默运行,nohup 和 & 都是常用的工具。但它们之间还是有些微妙的区别,用对了能省不少事。

解决方案

简单来说,& 是让命令在后台运行,但当你关闭终端时,这个进程也会收到 SIGHUP 信号而退出。nohup 的作用就是忽略 SIGHUP 信号,让程序在后台持续运行,即使你关闭终端也没关系。
具体用法:

&:command &直接在命令后面加上&,程序就被丢到后台运行了。你会看到一个进程 ID (PID)。nohup:nohup command > output.log 2>&1 &这个命令稍微复杂一点。nohup告诉系统忽略 SIGHUP 信号。> output.log是将标准输出重定向到output.log文件,2>&1是将标准错误也重定向到标准输出(也就是output.log)。最后的&还是让整个命令在后台运行。
nohup 和 & 的区别是什么?
最关键的区别就是对 SIGHUP 信号的处理。& 只是让进程在后台运行,但当终端关闭时,进程会收到 SIGHUP 信号,默认情况下会退出。nohup 会忽略这个信号,保证进程持续运行。
另外,nohup 默认会将输出信息追加到 nohup.out 文件中,如果不想看到这个文件,可以用重定向将输出信息导向其他地方,例如上面例子中的 output.log。
什么时候应该使用 nohup?什么时候应该使用 &?
使用
nohup的场景: 你需要程序长时间运行,即使关闭终端也不希望它停止。例如,运行一个服务器程序,或者进行长时间的数据处理任务。使用
&的场景: 你只是想暂时把程序丢到后台,不需要它长时间运行,或者你知道即使终端关闭,程序也能正常处理 SIGHUP 信号。例如,运行一个简单的脚本,或者启动一个图形界面程序。
为什么我用 nohup 运行的程序还是退出了?
这可能是以下几个原因:
-
程序自身错误: 程序内部出现了错误,导致崩溃退出,这和
nohup无关。查看日志文件(例如nohup.out或你指定的输出文件),看看有没有错误信息。 - 内存不足: 程序运行需要大量内存,而系统内存不足,导致程序被 kill 掉。
- 被其他进程 kill 掉: 可能有其他进程(例如系统监控进程)认为你的程序占用过多资源,将其 kill 掉。
- 磁盘空间不足: 程序需要写入大量数据到磁盘,但磁盘空间不足,导致程序无法正常运行。
要排查问题,需要仔细查看日志,并监控系统资源使用情况。
如何查看后台运行的程序?
可以使用 ps 命令查看当前运行的进程。例如,ps aux | grep your_program_name 可以查找包含 "your_program_name" 的进程。top 命令可以实时查看系统资源使用情况,包括 CPU、内存等。
如何停止后台运行的程序?
首先,使用 ps 命令找到程序的 PID。然后,使用 kill PID 命令发送 SIGTERM 信号给程序,尝试正常停止程序。如果程序没有响应,可以使用 kill -9 PID 命令发送 SIGKILL 信号强制停止程序。注意,强制停止程序可能会导致数据丢失。









