运行命令而无需等待


145

在CLI上,有时我键入的命令需要一段时间才能完成,有时我知道何时会发生。我对Linux的“后台”等感到有些困惑。

告诉CLI我不想等待的最常见(或用户友好方式)是什么,请立即将提示信息还给我。而且,如果它可以为我提供进度条或只是忙碌的忙碌者,那就太好了!


3
另请参阅如何将命令行应用程序直接发送到后台?如果您已经启动了命令并将其发送到后台。
Gilles

Answers:


153

在运行命令之前,您可以追加&到命令行以在后台运行:

long-running-command &

启动命令后,可以按CtrlZ将其挂起,然后bg将其置于后台:

long-running-command
[Ctrl+Z]
bg

我使用了“ find〜/ a.java&”命令,但是我没有进入后台吗?此外,我尝试了cmd + z(对于Mac)....它不起作用
Abhimanyu Aryan 2015年

1
@AbhimanyuAryan,也许您想先调试find ...命令,然后在后台运行它。在这种情况下,您将丢失该-name选项。
亚历克西斯威尔克

113

这是所有人的最爱,因为除了将过程发送到后台之外,您不必担心文本输出会弄脏终端:

nohup command &

这不仅会在后台运行该进程,还会生成一个日志(nohup.out在当前目录中称为日志,如果不可能的话,在您的主目录中),并且如果您关闭/注销当前shell,则不会通过阻止子进程接收而杀死该进程父进程在被杀死时发出信号(即,通过SIGHUP注销到父进程,或关闭当前shell)。

还有一个叫,disown但这是其他答案的扩展,而不是一个方法本身:

command & # our program is in background
disown # now it detached itself of the shell, you can do whatever you want

这些命令不允许您轻松恢复过程输出,除非您使用怪异的方法来完成它。


4
自95年以来为Sysadmin。直到今天为止都没听说过解散,谢谢!但是,它不适用于每个shell(检查bash,zsh,tcsh。tcsh无效)。
yoonix 2013年

使用nohup在作业控制Shell是愚蠢的。现代shell不会发送HUP给后台进程。重定向到唯一的文件名需要付出很小的代价。
小鸡

@chicks这里的用例是防止stderr和stdout带有自动创建日志文件的优点,从而污染终端。
Braiam 2015年

1
command > file.log 2>&1 & disown有点长,nohup command &但我想这就是@chicks的建议。
joeytwiddle '16

31

这可能是您想要的

my_command > output.log 2>&1 &

这将启动您的命令,将stdout和stderr都重定向到output.log您可以指定的位置。如果您根本不希望存储输出,则可以使用/dev/null而不是实际文件。

&会在后台执行命令,以便您可以在运行时继续输入命令。 2>&1将stderr重定向到stdout,以便捕获所有输出。

同样,当您运行类似这样的命令时,您应该从内核中获得类似于以下内容的确认信息: [2] 1234 这意味着您的进程正在后台运行,其ID为1234,因此如果您愿意,可以稍后将其终止kill -9 1234


2
谢谢,2>&1非常重要,因为命令可能会失败,并在某些情况下尝试输出错误!
ericn

1
当以上答案不满意时,此方法将起作用。
Domagoj '18 October 10'7

9

查看屏幕tmux。的示例tmux

$ tmux new -d 'longrunningcommand'

虽然其他使用“&”作为背景的答案都可以使用,但是您必须重定向stdout(和stderr!)。否则,输出将直接进入您的外壳,并与您可能拥有的任何其他输出混合。

如果您正在执行长命令并注销或断开连接,则后台也会失败。该系统将杀死您的工作。

如果您不熟悉screen或tmux,则它们基本上可以让您完全脱离外壳。不用后台程序,而是后台整个shell。之后,您甚至可以从另一台计算机上切换回它。它们都具有更多的功能,您可能会或可能不会在此用例之外发现有用的功能。

屏幕是久经考验的真实程序;tmux还年轻,但已经从screen的过去中学到了东西。


这个答案错过了实际答案,听起来像RTFM。
Lloeki

5

(为完整性起见,已回答:)您可以通过&在命令后添加以下命令来在后台放置命令:

long_command with arguments > redirection &

我正在添加此答案以解决您问题的另一部分:

显示正在运行的后台命令的旋转器没有真正的等效功能,但是您可以通过键入jobs或来查看后台命令的状态jobs -l。它会向您显示您的后台命令,以及它们是否正在运行,通过信号停止(例如,带有^Z),还是偶尔停止,因为它们正在等待您的交互式输入。


long_command with arguments &> redirection &重定向stderr
Ice-Blaze

3

您可以使用在后台运行程序&。例如,如果要运行yum install XyZ,可以运行:

yum install XyZ &

stdout可以使用>覆盖文件或>>附加到文件的方式重定向程序的或输出。例如,如果您要登录yum文件yum.log

yum install XyZ > yum.log &

或者,如果您想将输出添加到现有文件中log

yum install XyZ >> log &

错误被打印到stderr而不是stdout,并且可以通过相同的方式重定向到文件,但是可以使用2>

yum install XyZ 2> errors
yum install XyZ 2>> errors

如果您想同时重定向stderrstdout,则可以使用&>

yum install XyZ &> output
yum install XyZ &>> output

2

您可以在后台运行命令,只需在&其后加上符号即可。

例如:

areallylong_command &

将在后台运行它。

您可以进一步将stdout / stderr重定向到适当的文件,以便在执行操作时它们不会出现在终端上。

请参阅此以获取更多信息:http : //tldp.org/HOWTO/Bash-Prog-Intro-HOWTO-3.html


0

在开始长时间运行的任务之前,请尝试使用“屏幕”命令,然后在分离时可以再次使用“屏幕-r -d”重新附加。我发现当通过ssh或其他网络连接使用终端时,有时它们会因与服务器的连接不良而损坏。在“屏幕”中运行它可以解决此问题。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.