在使用 Bash 的桌面上,我应该使用“&”、nohup、disown 或三者的某种组合来启动进程并让它完全独立运行吗?

在使用 Bash 的桌面上,我应该使用“&”、nohup、disown 或三者的某种组合来启动进程并让它完全独立运行吗?

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

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

gedit &我不明白和之间的区别gedit & disown,因为如果我终止父终端或注销 ssh 会话,那么在任何一种情况下 gedit 都会被“否认”。

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

至于三和四,我一直读到存在技术差异,但完全不明白为什么你会更喜欢其中一个。

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

答案1

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

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

    A。该任务无需我的交互式输入即可完成。

     nohup do_my_stuff &
    

    b.该任务可能需要我在标准输入上提供一些信息。

     man tmux
     history -w
     tmux
     do_my_stuff
    
  2. 后台进程在某种程度上增强了我当前的会话,并且应该与会话一起消失。非常罕见。

     enhance_my_session  >>/tmp/enhance.$$.log 2>&1 &
    
  3. 我希望它在我的 ssh 会话中随机吐出一些日志。等等,什么?不,我永远不会想要那样。谢谢disown

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

答案2

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

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

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

答案3

您必须区分退出 shell 和中止终端。

  1. 当 shell 收到中止信号时,它会杀死所有已知的作业(但不包括它们的子作业)。
  2. 终端会杀死它作为控制终端的所有内容。

一般来说,最好的解决方案(在用户级别)恕我直言是screen

如果您的任务与系统相关而不是与用户相关,您可以将其设为 systemd 服务,而不是手动启动。

相关内容