有多个答案在这里,这取决于你想要什么(这个答案是有效的bash和zsh贝壳,其他人可能会发生变化)。
如果你需要在后台运行一个命令并且你在运行它之前知道它,只需&在命令的末尾添加一个(使用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),除非您关闭它,否则它将转到终端,在这种情况下,行为是完全未定义的。使用重定向处理后台进程的输出是一种很好的做法。