如何关闭终端而不杀死其子终端(不先运行“screen”)?

如何关闭终端而不杀死其子终端(不先运行“screen”)?

有时我在 gnome 终端中运行一个应用程序,但随后我突然必须重新启动 gnome 或其他东西。我想这个问题的答案也很有用,然后我想在发生某些事情时断开与 SSH 的连接。

Gnome 的终端树如下所示:

gnome-terminal
    bash
        some-boring-process

我可以“分离” bashgnome-terminalsome-boring-process从 bash 分离并将其输出重定向到某处)吗?如果我只是杀死gnome-terminalbash将被杀死以将其所有子进程

答案1

如果some-boring-process在当前的 bash 会话中运行:

  1. 停止它,ctrl-z给你 bash 提示符
  2. 把它放在后台bg
  3. 记下作业编号,或使用jobs命令
  4. 将进程与此 bash 会话分离disown -h %1(替换那里的实际作业号)。

这对重定向输出没有任何作用——当你启动无聊的过程时,你必须考虑到这一点。 [编辑]似乎有一种方法可以重定向它https://gist.github.com/782263

但说真的,看看屏幕。我的远程服务器上有 shell,已经运行了几个月。


看起来像这样:

$ sleep 999999
^Z
[1]+  Stopped                 sleep 999999
$ bg
[1]+ sleep 999999 &
$ disown -h %1

答案2

这正是屏幕多路复用器是为.您可以在 screen/tmux 会话中运行 shell,并且可以随意断开/重新连接。您还可以在一个 gnome 终端内运行多个 shell 会话。

答案3

screen,tmux, 或者dtach(可能与dvtm)都非常适合这一点,但如果您不想使用其中之一,您也许可以利用nohup

答案4

如果我启动了一些我无论如何都想完成的东西(除了系统重新启动),我会nohup在后台使用并运行它。与 screen 等不同,您无法重新连接到进程。然而,除非在其他地方进行重定向,否则任何输出都可以在 中找到nohup.out

screen当我希望能够切换进程的终端时,我确实会使用它。例如从家庭/工作开始一个流程并切换到另一个。与任何其他终端会话输出一样,最终将滚动到缓冲区顶部。

编辑:如果您已经启动了该进程,则可以使用disown该进程来防止HUP在进程关闭时发送信号。

相关内容