异步 shell 命令

我尝试使用一个 shell 脚本来启动一个命令。我不在乎它是否/何时/如何/为什么结束。我希望这个过程能够启动并运行,但是我希望能够立即返回到 shell..。

115914 次浏览

你可以在后台运行脚本:

$ myscript &

请注意,这不同于将 &放在脚本中,后者可能不会完成您想要的任务。

Alternatively, after you got the program running, you can hit Ctrl-Z which stops your program and then type

BG

把你上次停止的程序放在后台。(如果您开始的东西没有’&’,但仍然希望它在后台没有重新启动它的有用)

nohup cmd

关闭终端时不会挂起。默认情况下输出到 nohup.out

你可以把这个和背景结合起来,

nohup cmd &

去掉输出,

nohup cmd > /dev/null 2>&1 &

你也可以使用命令 disown。输入 cmdCtrl-Zbgdisown

大家都忘记了 disown。下面是一个总结:

  • & puts the job in the background.

    • Makes it block on attempting to read input, and
    • 使外壳不等待它的完成。
  • disown将进程从 shell 的作业控制中移除,但仍将其连接到终端。

    • 结果之一是 shell 不会向它发送 SIGHUP(如果 shell 收到 SIGHUP,它也会向进程发送 SIGHUP,这通常会导致进程终止)。
    • And obviously, it can only be applied to background jobs(because you cannot enter it when a foreground job is running).
  • nohup断开进程与终端的连接,将其输出重定向到 nohup.out,并保护它不受 SIGHUP的影响。

    • 进程将不会接收任何发送的 SIGHUP
    • 它完全独立于作业控制,原则上也可以用于前台作业(尽管这不是很有用)。
    • 通常与 &一起使用(作为后台作业)。

screen -m -d $command$在一个分离的会话中启动命令。可以使用 screen -r附加到已启动的会话。它是一个非常好的工具,对于远程会话也非常有用。请在 man screen阅读更多内容。