136

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

命令是这样的:

perl script.pl > output.log &

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

我对 shell 有基本的了解,但我以前从未见过。

4

5 回答 5

189

使&命令在后台运行。

来自man bash

如果命令由控制运算符&终止,则 shell 在子 shell 的后台执行命令。shell 不等待命令完成,返回状态为 0。

于 2012-11-12T05:41:36.943 回答
23

如果没有另行通知,命令将占据前台。您只有一个“前台”进程在单个 shell 会话中运行。& 符号指示命令在后台进程中运行,并立即返回命令行以获取其他命令。

sh my_script.sh &

shell 会话关闭后,后台进程将不会保持活动状态。SIGHUP终止所有正在运行的进程。反正默认。如果您的命令长时间运行或无限期运行(即:微服务),您需要使用 nohup 对其进行 pr-pend,以便在您断开会话后它仍然运行:

nohup sh my_script.sh &

编辑:使用 & 时,后台进程的关闭似乎确实存在灰色区域。请注意,shell可能会根据您的操作系统和本地配置(尤其是在 CENTOS/RHEL 上)关闭您的进程: https ://serverfault.com/a/117157 。

于 2017-03-18T18:13:48.570 回答
17

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

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

于 2014-10-23T17:38:17.430 回答
3

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

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

于 2018-12-23T07:39:35.027 回答
0

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

例如:

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

  2. 命令eclipse启动 Eclipse IDE。

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

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

答案是:通过附加&在这样的命令之后。

 user@mymachine:~$ <command> &

例子:

user@mymachine:~$ <command> gedit &
user@mymachine:~$ <command> eclipse &
于 2022-01-05T19:42:05.443 回答