在 Unix/Linux 系统中,nohup
命令和 &
符号都是用来在后台运行命令的工具,但它们有一些区别。
nohup
nohup
命令允许你在终端关闭之后继续运行进程。通常情况下,当你退出终端会话时,正在运行的进程会被挂断(SIGHUP 信号)。nohup
命令则会忽略 SIGHUP 信号,使得进程即使在终端关闭后也能继续运行。
& 符号
&
符号用来将命令放入后台运行。当你在命令后面加上 &
,shell 会立即将该命令放入后台执行,并立即返回命令提示符,允许你执行其他命令。
区别
-
忽略 SIGHUP:
nohup
命令会忽略 SIGHUP 信号,这意味着即使你在终端会话结束后,进程仍然可以继续运行。而使用&
符号的命令不会忽略 SIGHUP 信号,除非你在.bashrc
或其他 shell 配置文件中设置了忽略 SIGHUP 信号。 -
输出重定向:
nohup
命令会自动将标准输出和标准错误输出重定向到一个名为nohup.out
的文件中(除非你指定了其他文件)。而使用&
符号的命令默认不会这样做,标准输出和标准错误输出仍然会被发送到终端。
使用示例
使用 nohup
nohup command arg1 arg2 > output.log 2>&1 &
这条命令会启动 command
并将输出重定向到 output.log
文件中。&
符号确保命令在后台运行。
使用 &
command arg1 arg2 > output.log 2>&1 &
这条命令同样会启动 command
并将输出重定向到 output.log
文件中,并在后台运行。
组合使用 nohup 和 &
你可以将两者结合起来使用,以确保进程在后台运行并且忽略 SIGHUP 信号:
nohup command arg1 arg2 > output.log 2>&1 &
在这种情况下,nohup
会忽略 SIGHUP 信号,&
会将命令放入后台执行。
示例代码
下面是一个具体的示例,展示如何使用 nohup
和 &
来后台运行一个命令,并将输出重定向到一个文件中:
#!/bin/bash
# 使用 nohup 和 &
nohup ./your_command arg1 arg2 > output.log 2>&1 &
# 获取后台进程的 PID
echo $! > pid.txt
这段脚本会执行以下步骤:
- 使用
nohup
运行your_command
,并将标准输出和标准错误输出重定向到output.log
文件中。 - 使用
&
符号将命令放入后台执行。 - 使用
echo $!
获取后台进程的 PID,并将其保存到pid.txt
文件中。
总结
- nohup 用于忽略 SIGHUP 信号,并且自动重定向输出。
- & 用于将命令放入后台执行。
结合使用 nohup
和 &
可以确保你的命令在后台运行,并且即使在终端会话结束后仍能继续执行。