如何在后台执行任务?

Ana*_*Das 4 command-line background-process

是否可以在后台运行从终端启动的任务或脚本?

Rma*_*ano 9

有多个答案在这里,这取决于你想要什么(这个答案是有效的bashzsh贝壳,其他人可能会发生变化)。

如果你需要在后台运行一个命令并且你在运行它之前知道它,只需&在命令的末尾添加一个(使用sleep 60,在 1 分钟内什么都不做,作为示例命令):

[romano:~] % sleep 60 &
[1] 9054
1& [romano:~] %
Run Code Online (Sandbox Code Playgroud)

如果你已经运行了它,你可以用ctrl-停止它Z,当 shell 给你一个提示时,你可以用命令将它作为背景bg

1& [romano:~] % sleep 60  
^Z
[1]  + 9084 suspended  sleep 60
1z [romano:~] 20 % bg
[1]  + 9084 continued  sleep 60
1& [romano:~] % 
Run Code Online (Sandbox Code Playgroud)

在这两种情况下,流程/作业仍然附加到您的终端;如果您关闭终端,则会向进程发送挂断(HUP) 信号 --- 大多数进程将正常退出。如果您需要确保该过程将继续,您可以从以下任一方式开始:

nohup sleep 60 & 
Run Code Online (Sandbox Code Playgroud)

或者,在使用bg或使用 simple将其发送到后台后&,告诉 shell 忘记它,使用:

disown %% 
Run Code Online (Sandbox Code Playgroud)

%%作业控制的快捷方式,这里代表后台发送的最后一个进程)。

然后你必须考虑进程的输出——在前两种情况下,输出仍然会到达终端;在这种情况下,nohup它将被转移到一个名为 的文件上nohup.out,而在后一种情况下(带有disown),除非您关闭它,否则它将转到终端,在这种情况下,行为是完全未定义的。使用重定向处理后台进程的输出是一种很好的做法。


小智 5

添加&到命令中。

例子:

$ cp FromA ToB &
Run Code Online (Sandbox Code Playgroud)