在带有 Bash 的桌面上,我应该使用“&”、nohup、disown 还是这三者的某种组合来启动进程并让它完全自行运行?

Har*_*her 8 bash nohup

当我在 Xubuntu 16.04 上运行这四个命令时,无论是在本地还是通过 ssh,它们似乎都在做完全相同的事情:

export DISPLAY=:0.0 #not necessary unless you have logged in over ssh instead of starting a terminal locally
Run Code Online (Sandbox Code Playgroud)
  1. gedit &
    
    Run Code Online (Sandbox Code Playgroud)
  2. gedit & disown
    
    Run Code Online (Sandbox Code Playgroud)
  3. nohup gedit
    
    Run Code Online (Sandbox Code Playgroud)
  4. nohup gedit & disown
    
    Run Code Online (Sandbox Code Playgroud)

我不明白两者之间的区别gedit &gedit & disown因为如果我杀死父终端或退出 ssh 会话,在任何一种情况下,gedit 似乎都被“否认”。

至于二和三,我看到的唯一区别是命令输出被记录到一个单独的文件中,并且即使产生 bg 进程的原始 shell 会话被终止,也会继续记录到该单独的日志中。

至于三和四,我一直在读到有技术差异,但完全不明白为什么你更喜欢一个而不是另一个。

我应该使用哪一种?我已经看到教程和问答中使用的所有四个命令,尽管有一些非常好的答案描述了 nohup 和 disown 之间的技术差异,但我似乎无法得到明确的建议(除了出于日志记录目的或 shell 兼容性)哪个我应该用。

kub*_*zyk 10

当我需要运行一个将运行很长时间的脚本并且我正在参加一个ssh会话时,我想要:

  1. 即使网络中断或我收拾笔记本电脑离开时,任务也应该继续。

    一种。该任务可以在没有我的交互式输入的情况下完成。

     nohup do_my_stuff &
    
    Run Code Online (Sandbox Code Playgroud)

    湾 该任务可能需要我在标准输入上提供一些东西。

     man tmux
     history -w
     tmux
     do_my_stuff
    
    Run Code Online (Sandbox Code Playgroud)
  2. 后台进程以某种方式增强了我当前的会话,应该与会话一起消失。罕见。

     enhance_my_session  >>/tmp/enhance.$$.log 2>&1 &
    
    Run Code Online (Sandbox Code Playgroud)
  3. 我希望这个东西在我的 ssh 会话中随机吐出一些日志。等等,什么?不,我永远不会想要那样。谢谢disown

  4. 另一件我不想要的事情:将进程转换为完全分离的守护进程,但避免在下次启动时自动启动它。我永远不会想要那样,因为我无法预测系统何时重新启动以及谁将重新启动它。


小智 1

通常,我只执行以下操作:

  1. myprog &如果我只想从当前的登录 shell 在后台运行某些内容。这对于我99%的时间来说已经足够了......

  2. nohup myprog > /my/path/output.txt &如果我从 shell 启动某些内容,但想随后注销(可能在后台任务仍在运行时)。