是否可以在后台运行从终端启动的任务或脚本?
答案1
这里有多个答案,取决于你想要什么(这个答案在bash
和zsh
shell 中有效,其他答案可能有所不同)。
如果您需要在后台运行命令并且在运行之前知道这一点,只需&
在命令末尾添加一个(使用sleep 60
,1分钟内不执行任何操作,作为示例命令):
[romano:~] % sleep 60 &
[1] 9054
1& [romano:~] %
如果你已经运行它,你可以用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:~] %
在这两种情况下,进程 / 作业仍然附加到你的终端;如果你关闭终端挂断(HUP)信号被发送到进程 --- 大多数进程将正常退出。如果您需要确保进程继续,您可以使用以下方式启动它:
nohup sleep 60 &
bg
或者,在使用或简单的将其发送到后台后&
,告诉 shell 忘记它,使用:
disown %%
(%%
是作业控制快捷方式,这里代表最后在后台发送的进程)。
然后,您必须考虑进程的输出 --- 在前两种情况下,输出仍将到达终端;在 的情况下,nohup
它将被转移到名为 的文件上nohup.out
,而在后一种情况下(使用disown
),它将转到终端,除非您关闭它,在这种情况下行为是相当不确定的。使用以下方法照顾后台进程的输出是一种很好的做法重定向。
答案2
添加&
到命令。
例子:
$ cp FromA ToB &
答案3
此示例将在后台运行更新:
sudo apt-get dist-upgrade -y &
只需注意单个 &。
如果要隐藏标准输出,请执行以下操作:
sudo apt-get dist-upgrade -y > /dev/null &
答案4
如果您希望它更高级,并且希望能够在稍后本地或通过 SSH 使用会话,则可以使用屏幕。
# screen
# apt-get update -y
然后按CTRL+,A接着按D。
稍后您可以重新连接:
# screen -rd