Linux 命令末尾的“ &”是什么意思?

我是一个系统管理员,我被要求运行一个 linux 脚本来清理系统。

命令是这样的:

perl script.pl > output.log &

所以这个命令以一个 &符号结束,这有什么特别的意义吗?

我有一些关于 shell 的基本知识,但是我从来没有见过这个。

271592 次浏览

&使命令在后台运行。

来自 man bash:

如果命令被控制操作符 & 终止,则 shell 在子 shell 中执行后台命令 而不是等待命令完成,并且 返回状态为0。

此外,可以使用“ &”符号通过一个(1) ssh 连接运行多个进程,以保持最少的终端数量。例如,我有一个进程为了提取文件而侦听消息,第二个进程为了上传文件而侦听消息: 使用“ &”我可以在一个终端上运行两个服务,通过单个 ssh 连接到我的服务器。

在 ssh 会话关闭后,通过“ &”运行的这些进程也将“保持活动”。如果到服务器的 ssh 连接被中断,而且没有使用终端多路复用器(screen、 tmux、 byobu) ,那么这种方法非常简洁和有用。

当没有告诉其他命令时,命令接管前台。在一个 shell 会话中只有一个“前台”进程在运行。& 符号指示命令在后台进程中运行,并立即返回到命令行以获取其他命令。

sh my_script.sh &

后台进程将在 shell 会话关闭后保持活动状态。注意终止所有正在运行的进程。无论如何都是默认的。如果您的命令是长时间运行或无限期运行(例如: microservice) ,您需要使用 nohup 来 pr-pend 它,以便在您断开会话之后它仍然在运行:

nohup sh my_script.sh &

编辑: 当使用 & 时,关于关闭后台进程似乎有一个灰色区域。请注意,shell 会根据操作系统和本地配置(特别是在 CENTOS/RHEL 上)关闭您的进程: Https://serverfault.com/a/117157.

我不确定,但我现在正在读一本书,我得到的是一个程序需要处理它的信号(当我按 CTRL-C)。现在程序可以使用 SIG_IGN忽略所有信号,或者使用 SIG_DFL恢复默认动作。

现在,如果执行 $ command &,那么这个作为后台进程运行的进程就会忽略将要发生的所有信号。对于前台处理,这些信号不会被忽略。

如果您有一个命令,执行和不返回状态0(控制提示)快速。

例如:

  1. 命令 gedit启动默认编辑器 gedit UI。

  2. Commandeclipse启动 eclipseIDE。

这些命令不断在终端中抛出活动日志,并且不返回命令提示符。

问题是,如何在后台运行这样的命令,使我们能够得到命令终端,我们可以使用终端的其他任务。

答案是: 在这样的命令后面附加 &

 user@mymachine:~$ <command> &

例子:

user@mymachine:~$ edit &
user@mymachine:~$ eclipse &