当我在 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)
gedit &
Run Code Online (Sandbox Code Playgroud)gedit & disown
Run Code Online (Sandbox Code Playgroud)nohup gedit
Run Code Online (Sandbox Code Playgroud)nohup gedit & disown
Run Code Online (Sandbox Code Playgroud)我不明白两者之间的区别gedit &
,gedit & disown
因为如果我杀死父终端或退出 ssh 会话,在任何一种情况下,gedit 似乎都被“否认”。
至于二和三,我看到的唯一区别是命令输出被记录到一个单独的文件中,并且即使产生 bg 进程的原始 shell 会话被终止,也会继续记录到该单独的日志中。
至于三和四,我一直在读到有技术差异,但完全不明白为什么你更喜欢一个而不是另一个。
我应该使用哪一种?我已经看到教程和问答中使用的所有四个命令,尽管有一些非常好的答案描述了 nohup 和 disown 之间的技术差异,但我似乎无法得到明确的建议(除了出于日志记录目的或 shell 兼容性)哪个我应该用。
kub*_*zyk 10
当我需要运行一个将运行很长时间的脚本并且我正在参加一个ssh
会话时,我想要:
即使网络中断或我收拾笔记本电脑离开时,任务也应该继续。
一种。该任务可以在没有我的交互式输入的情况下完成。
nohup do_my_stuff &
Run Code Online (Sandbox Code Playgroud)
湾 该任务可能需要我在标准输入上提供一些东西。
man tmux
history -w
tmux
do_my_stuff
Run Code Online (Sandbox Code Playgroud)后台进程以某种方式增强了我当前的会话,应该与会话一起消失。罕见。
enhance_my_session >>/tmp/enhance.$$.log 2>&1 &
Run Code Online (Sandbox Code Playgroud)我希望这个东西在我的 ssh 会话中随机吐出一些日志。等等,什么?不,我永远不会想要那样。谢谢disown
。
另一件我不想要的事情:将进程转换为完全分离的守护进程,但避免在下次启动时自动启动它。我永远不会想要那样,因为我无法预测系统何时重新启动以及谁将重新启动它。
小智 1
通常,我只执行以下操作:
myprog &
如果我只想从当前的登录 shell 在后台运行某些内容。这对于我99%的时间来说已经足够了......
nohup myprog > /my/path/output.txt &
如果我从 shell 启动某些内容,但想随后注销(可能在后台任务仍在运行时)。