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


35

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

Gnome的终端树如下所示:

gnome-terminal
    bash
        some-boring-process

我可以bash从中“分离” gnome-terminal(或some-boring-process从bash 分离并将其输出重定向到某个地方)吗?如果我只是杀死gnome-terminalbash将被杀死,将其所有子进程


Answers:


48

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

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

这并没有做任何事情来重定向输出-在启动无聊的过程时必须考虑到这一点。[编辑]似乎有一种重定向它的方法https://gist.github.com/782263

但是请认真看一下屏幕。我在运行了几个月的远程服务器上安装了Shell。


谢谢。我选择了您的答案,因为它是回答问题的唯一答案(这与已经运行的进程有关)。我screen有时已经在使用它,尽管它有问题,并且我不想在我生命中的每个 bash会话中使用它
valya 2011年

您不会在每个bash会话中都使用它,而是在您花费大量时间的每个远程计算机上使用它。
格伦·杰克曼

我随意添加有关重定向输出的信息,请仔细阅读!
瓦利亚2011年

[root @
server〜]#bg

为什么我得到了bash: bg: current: no such job
Muhammad Dyas Yaskur

10

这正是创建屏幕tmux的目的。您可以在screen / tmux会话中运行外壳程序,并且可以随意断开/重新连接。您还可以在一个gnome终端中运行多个Shell会话。


谢谢,但是,正如我对公认的答案所做的评论:1.问题是关于已经在运行的进程。2. screen有它的问题,我不想在生活中的每一次bash会话中都使用它
valya 2011年

6

screentmuxdtach(可能带有dvtm)都非常有用,但是如果您不打算使用其中之一,则可以使用nohup


谢谢,但是,正如我对公认的答案所做的评论:1.问题是关于已经在运行的进程。2. screen有它的问题,我不想在生活中的每一次bash会话中都使用它
valya 2011年

@valya Glad,您找到了解决方案。不过,请注意,nohup通过使用该-p选项(如果可用)可以在运行的进程中运行。
汉克·盖伊

@汉克·盖伊:我在手册页中看不到任何-p选项nohup;您在什么系统上?
Mikel

@Mikel在我学会不再担心和喜欢之前tmux,我-p在Solaris机上使用了该选项。我在混合的CentOS盒子上做这件事也有模糊的记忆(可能zsh有一个内置的支持它的东西?),但是我找不到关于它的任何文档。
汉克·盖伊

@Hank Gay:我的Ubuntu Linux系统上都bash没有zsh提供nohup
Mikel

4

如果您想继续与子进程进行交互,而不仅仅是使其后台运行并继续运行,那么实际上有一个名为retty的程序,它是概念性证明,可以从当前tty中“窃取”一个进程并将其重新连接到当前的一个。

但是,它做了一些可怕的事情,包括将一些汇编代码粘贴到重新连接的应用程序的堆栈上。而且该代码尚未针对x86_64更新。

还有另一个程序采用了更好的方法,将用户空间中的进程冻结到一个文件中,以后可以从该文件中还原该文件(可能在另一个tty上。)这是cryopid,并且该项目似乎也已在文件中停止了。概念验证阶段,并且在现代Linux上无法正常运行。呃,好吧。

只是认为这应该是为了完整性。如果您不介意使用可怕的伏都教,那么这在可能性范围之内-至少在理论上是可能的。


1
这让我想起了gist.github.com/782263 ...哦,要点似乎也回答了我的问题
valya 2011年

2

如果我不管什么都启动了我想完成的事情(在没有重新启动系统的情况下),我nohup将在后台使用并运行它。与screen之类的东西不同,您无法重新加入流程。但是,可以在中找到其他任何地方的禁止重定向nohup.out

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

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


谢谢,但是,正如我对公认的答案所做的评论:1.问题是关于已经在运行的进程。2. screen有它的问题,我不想在生活中的每个bash会话中都使用它
valya 2011年

@valya我已经看到了有关从程序组断开正在运行的进程的参考。我不知道有什么工具可以这样做。该工具可能还需要重定向标准IO通道。我想我可能已经让它工作了一次,但认为nohup更简单了。
BillThor

1

当终端会话结束时,可以使进程(PID)不接收HUP信号。使用以下命令:

nohup -p PID

nohup: invalid option -- 'p'nohup您在哪种系统上运行的是哪个版本?
Anthon

我主要使用Solaris和AIX。对于Linux,您应该签入disown命令。
托尼

是的,-pLinux 上没有选项,因此此答案特定于Solaris和AIX。不过要知道
Sergiy Kolodyazhnyy 2016年

1

此脚本将子进程与父进程分离,并将其分配给init进程:

toDetach=$1

./$toDetach & # Runs the process - script on background

disown -h %$(jobs -l | grep $(ps -A | grep $toDetach | cut --delimiter=' ' -f1) | cut --delimiter=' ' -f1 | tr -d '[]+') # and then disowns it from parents process
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.