&
&
在Unix-like的操作系统(如Linux和macOS)的shell中,特别是在Bash这样的shell中,经常用作后台运行符号。让我们深入了解一下其功能和用法。
&
作为后台运行符号:
-
基本用法:
当我们在一个命令或者一组命令的后面加上&
,它们会在后台执行。这意味着这些命令不会阻止我们获得命令行提示符,可以继续执行其他命令。例如:
sleep 10 &
这会在后台启动
sleep
命令,持续10秒。在此期间,我们会立即获得命令行提示符,可以进行其他任务。 -
作业控制:
当在后台启动任务时,它将被视为一个“作业”。可以使用作业控制命令来管理这些后台任务。jobs
: 列出当前shell中的所有后台作业。fg %jobnumber
: 将后台作业带到前台运行。bg %jobnumber
: 如果一个作业在后台被暂停,此命令可以继续在后台运行它。
例如,如果运行
sleep 30 &
并且之后运行jobs
,会看到有一个作业在后台运行。 -
输出:
即使命令在后台运行,它的输出(stdout和stderr)默认仍然会发送到当前终端。这可能会中断当前工作。为了避免这种情况,通常会将输出重定向到文件或/dev/null
。重定向到文件可以帮助我们保留输出以供以后查看,而重定向到/dev/null
实际上是丢弃输出。 -
结束:
当关闭终端时,默认情况下所有后台作业都会被终止。为了防止这种情况,可以使用nohup
命令或者disown
命令。例如:
nohup long_running_command &
或者,如果已经在后台启动了一个作业:
long_running_command & disown %1
其中
%1
是作业号,通常是启动的第一个作业。可以使用jobs
命令查看作业号。
总之,&
符号为命令行用户提供了一个方便的方式来在后台执行任务,从而使用户可以并行地进行多个任务。
此处,我们展开说一下输出:
(1) 重定向到文件:
如果想保留输出以供以后查看,可以将 stdout
和 stderr
重定向到文件。
long_running_command > output.log 2>error.log &
在这里,正常的输出(stdout
)被重定向到 output.log
,而错误输出(stderr
)被重定向到 error.log
。
(2) 将 stdout
和 stderr
重定向到同一文件:
long_running_command > output.log 2>&1 &
这会将正常的输出和错误都保存在 output.log
中。
(3) 重定向到 /dev/null
:
如果不关心输出并希望完全丢弃它,可以使用 /dev/null
。这是一个特殊的设备,通常被称为“黑洞”,因为写入它的任何东西都会被永久丢弃。
long_running_command > /dev/null 2>&1 &
这里,正常的输出和错误都被发送到 /dev/null
,从而被完全丢弃。
使用这些重定向技术,可以确保后台任务的输出不会干扰我们的终端会话,同时还可以选择保留或丢弃输出。
nohup命令
nohup
是Unix和Linux系统中的一个命令,用于在退出帐户或关闭终端后继续运行命令。其名称“nohup”来源于“no hang up”,表示即使挂起也不中断执行。
以下是对nohup
命令的详细介绍:
-
基本用途:
当在终端中运行一个命令时,如果退出终端或关闭它,命令通常会被终止。使用
nohup
,可以保持这个命令在后台运行,即使终端已关闭。例如,要在后台运行一个长时间运行的脚本并确保即使关闭终端也不会停止,可以这样做:
nohup ./long-running-script.sh &
-
输出重定向:
默认情况下,
nohup
命令将命令的输出(stdout和stderr)重定向到名为nohup.out
的文件中。如果希望将输出重定向到其他位置,可以这样做:nohup ./script.sh > myoutput.log 2>&1 &
-
与后台运行结合:
通常,
nohup
与&
结合使用,这样命令就可以在后台启动并立即返回命令提示符。如果不使用&
,命令将在前台开始,但即使关闭终端也会继续运行。 -
如何终止
nohup
命令:要终止使用
nohup
运行的进程,首先需要找到其进程ID(PID),可以使用ps
命令和grep
工具来查找。一旦得到PID,可以使用kill
命令来终止它。例如:
ps aux | grep long-running-script.sh
上述命令会显示与
long-running-script.sh
相关的进程。找到PID后,使用:kill -9 <PID>
来终止进程。
-
目的与使用场景:
nohup
命令特别适用于远程登录到服务器并启动长时间运行的任务的场景。使用nohup
可以确保任务继续运行,即使网络连接断开或用户注销。
总之,nohup
是一个非常有用的命令,允许在Unix-like操作系统中的任务在没有终端干预的情况下持续运行。这在系统管理、长时间数据处理任务和其他需要持续运行的场景中特别有用。
disown命令
disown
是 bash 和一些其他 shell中的内建命令,用于从 shell 的作业表中移除作业,从而使它们与当前 shell 会话解除关联。这意味着,当关闭或退出 shell 时,这些作业(或进程)不会接收到 HUP(hang up)信号,因此它们不会被终止。
下面详细介绍 disown
命令:
-
基本用法:
当在 shell 中启动一个后台任务,然后决定使其在退出 shell 时保持运行状态,可以使用
disown
。例如,假设启动了一个后台进程:
long-running-command &
之后,可以简单地运行
disown
,该命令将移除最近发送到后台的任务。 -
指定作业号:
如果有多个后台任务,并且只想
disown
其中的一个或几个,可以使用作业号(可以使用jobs
命令查看)。例如:
[1] + running sleep 300 [2] running long-running-command
要移除第二个任务,可以使用:
disown %2
-
移除所有作业:
disown
命令也可以与-a
选项一起使用,从作业表中移除所有作业。disown -a
-
移除当前 shell 启动的所有作业:
使用
-r
选项可以移除由当前 shell 启动的所有作业:disown -r
-
与
nohup
的比较:disown
和nohup
都可以使进程在退出 shell 时继续运行。但它们的工作方式有所不同:nohup
是在启动进程时使用的,以确保进程从一开始就与 shell 解除关联。disown
是在进程已经启动后使用的,以后续地从 shell 的作业表中移除进程。
总的来说,disown
是一个在需要长时间运行的后台任务,但又不想这些任务在退出或关闭 shell 时被终止的情况下非常有用的工具。它允许我们管理和保持这些后台任务的持续运行,即使我们的 shell 会话已经结束。