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

告诉CLI不想等待的最常见(或用户友好方式)是什么,请给我立即返回提示。如果可以给我一个进度条或忙碌的忙碌者,那就太好了!

评论

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

#1 楼

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

long-running-command &


启动命令后,可以按CtrlZ将其挂起,然后然后将bg放在背景中:

long-running-command
[Ctrl+Z]
bg


评论


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

– humble_introvert
15年8月5日在10:08

@AbhimanyuAryan,也许您想先调试find ...命令,然后在后台运行它。在这种情况下,您缺少-name选项。

– Alexis Wilke
16年8月18日在5:19

我希望你今天对火山爆发没事@Greg Hewgill

–凯尔·布莱恩汀(Kyle Bridenstine)
19/12/9在17:54

@KyleBridenstine是的,这里没有问题,就像在800公里外。感谢您的来信。

– Greg Hewgill
19/12/9在18:40

#2 楼

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

nohup command &


在后台运行该进程,还生成一个日志(在当前目录中称为nohup.out,如果不可能,则在您的主目录中),如果关闭/注销当前shell,则不会通过阻止子进程接收父进程而终止进程

还有一个叫disown的信号,但是它是其他答案的扩展,而不是方法本身: br />
command & # our program is in background
disown # now it detached itself of the shell, you can do whatever you want


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

评论


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

–yoonix
2013年12月5日,下午2:36

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

–小鸡
15年11月4日在16:47

@chicks这里的用例是防止stderr和stdout用自动创建日志文件的优点来污染终端。

–脑袋
15年11月4日在16:50

命令> file.log 2>&1&disown比nohup命令长&但我想这就是@chicks的建议。

– joeytwiddle
16年9月1日在7:33

#3 楼

这可能就是您想要的

my_command > output.log 2>&1 &

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

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

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

评论


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

–ericn
17年6月16日在3:09

当以上答案不满意时,此方法将起作用。

– Domagoj
'18 -10-1在7:30

#4 楼

查看屏幕或tmux。 tmux的示例:

$ tmux new -d 'longrunningcommand'


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

如果您运行长命令并注销或断开连接,则背景也会失败。该系统将终止您的工作。

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

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

评论


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

– Lloeki
17年6月20日在12:54



#5 楼

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

long_command with arguments > redirection &


我添加此答案以解决其他问题您的问题的一部分:

没有任何等效的微调器可以显示正在进行的后台命令,但是您可以通过输入jobsjobs -l来查看后台命令的状态。它会向您显示您的后台命令,以及它们是否正在运行,是否通过信号停止(例如,通过^Z停止),还是偶尔停止,因为它们正在等待您的交互式输入。

评论


使用参数&>重定向&来重定向stderr的long_command

–冰焰
17年1月11日在7:24

#6 楼

您可以使用&在后台运行程序。例如,如果您想运行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


#7 楼

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

例如:

areallylong_command &


将在后台运行命令。

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

有关更多信息,请参见此: http://tldp.org/HOWTO/Bash-Prog-Intro-HOWTO-3.html

#8 楼

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