返回

后台进程管理:nohup 与 &,关键差异详解

Linux

后台进程管理:nohup vs. &

在 Linux 系统中,后台进程 是一种在用户注销或关闭终端后仍能继续运行的进程。管理后台进程的常用方法包括 nohup&,但它们存在着一些关键差异。

nohup vs. & :关键差异

标准输出和错误处理

  • & (后台运行) :使用 & 运行进程时,标准输出和错误输出将重定向到 /dev/null,即丢弃。
  • nohup (无挂断) :使用 nohup 运行进程时,标准输出和错误输出将重定向到指定的日志文件(默认为 nohup.out),否则重定向到标准输出。

作业控制

  • & (后台运行) :使用 & 运行的进程成为子进程,受父 shell 控制,可以通过 jobskill 命令管理。
  • nohup (无挂断) :使用 nohup 运行的进程成为独立进程,不受父 shell 控制,需要使用 pgreppkill 等工具管理。

信号处理

  • & (后台运行) :继承父 shell 的信号处理设置,如果父 shell 接收到中止信号,子进程也会收到并终止。
  • nohup (无挂断) :忽略 SIGHUP 信号,即使父 shell 终止,进程仍继续运行。

使用场景

  • 使用 & :不关心输出,需要在后台运行长时间任务(如计算或下载)。
  • 使用 nohup :需要记录输出,在后台运行日志记录或数据收集脚本。

示例

  • 使用 & 运行命令在后台运行:
$ myprocess.out &
  • 使用 nohup 运行命令在后台运行并记录输出:
$ nohup myprocess.out > myprocess.log &

结论

nohup& 都是管理后台进程的有效工具,但根据不同的输出处理、作业控制和信号处理需求选择合适的工具非常重要。

常见问题解答

Q1:为什么使用 nohup 而不使用 &
A1:当需要记录进程输出时,使用 nohup

Q2:如何查看 nohup 进程的日志输出?
A2:使用 cat nohup.out 命令。

Q3:如何终止 nohup 进程?
A3:使用 pkill -f myprocess.outpgrep -f myprocess.out | xargs kill -9 命令。

Q4:nohupscreen 有什么区别?
A4:screen 是一种终端多路复用器,允许在多个虚拟终端之间切换,而 nohup 用于管理后台进程。

Q5:nohup 是否可以防止进程被 SIGKILL 信号终止?
A5:否,SIGKILL 信号无法被阻止。