当我在 Xubuntu 16.04 上运行这四个命令时,无论是本地还是通过 ssh,它们似乎都执行完全相同的操作:
export DISPLAY=:0.0 #not necessary unless you have logged in over ssh instead of starting a terminal locally
gedit &
gedit & disown
nohup gedit
nohup gedit & disown
gedit &
我不明白和之间的区别gedit & disown
,因为如果我终止父终端或注销 ssh 会话,那么在任何一种情况下 gedit 都会被“否认”。
至于第二个和第三个,我看到的唯一区别是命令输出被记录到一个单独的文件中,并且即使生成 bg 进程的原始 shell 会话被终止,也会继续记录到该单独的日志中。
至于三和四,我一直读到存在技术差异,但完全不明白为什么你会更喜欢其中一个。
我应该使用哪一个?我已经看到教程和问答中使用的所有四个命令,尽管有一些非常好的答案描述了 nohup 和 disown 之间的技术差异,但我似乎无法得到明确的建议(除了可能用于日志记录目的或 shell 兼容性)我应该用。
答案1
当我需要运行一个将运行一段时间的脚本时很久,并且我正在参加会议ssh
,我想要:
即使网络中断或我收拾笔记本电脑离开时,任务也应该继续进行。
A。该任务无需我的交互式输入即可完成。
nohup do_my_stuff &
b.该任务可能需要我在标准输入上提供一些信息。
man tmux history -w tmux do_my_stuff
后台进程在某种程度上增强了我当前的会话,并且应该与会话一起消失。非常罕见。
enhance_my_session >>/tmp/enhance.$$.log 2>&1 &
我希望它在我的 ssh 会话中随机吐出一些日志。等等,什么?不,我永远不会想要那样。谢谢
disown
。我永远不想要的另一件事:将进程转换为完全分离的守护进程,但避免在下次启动时自动启动它。我永远不会想要这样,因为我无法预测系统何时重新启动以及谁将重新启动它。
答案2
通常,我只执行以下操作:
myprog &
如果我只想从当前的登录 shell 在后台运行某些内容。这对于我99%的时间来说已经足够了......nohup myprog > /my/path/output.txt &
如果我从 shell 启动某些内容,但想随后注销(可能在后台任务仍在运行时)。
答案3
您必须区分退出 shell 和中止终端。
- 当 shell 收到中止信号时,它会杀死所有已知的作业(但不包括它们的子作业)。
- 终端会杀死它作为控制终端的所有内容。
一般来说,最好的解决方案(在用户级别)恕我直言是screen
。
如果您的任务与系统相关而不是与用户相关,您可以将其设为 systemd 服务,而不是手动启动。