如何筛选已经运行的会话?

如何筛选已经运行的会话?

可能的重复:
如何否认正在运行的进程并将其关联到新的屏幕外壳?

screen在会话中运行长进程是一个很好的做法,以保护它们免受会话挂起的影响。但是,如果我已经有一个正在运行的进程但我忘记运行了,我该怎么办screen?是否可以以某种方式“捕获”当前会话并用 保护它screen

答案1

你想看看 retty 程序。它的主页是http://pasky.or.cz//dev/retty/

这个想法是重定向你的 stdin/stderr/stdout,你可以使用 gdb 来做到这一点,但是这个小程序使得这样做更容易。它并不完美,但应该可以完成工作。

答案2

除了已经提到的雷蒂雷普特尔,尼尔克斯注入代码也提供该功能。

答案3

并不真地。

你能得到的最接近的是:

启动一个新的屏幕窗口,运行:

trap '' INT HUP
exec sleep 99999999

在里面。记录该窗口的 tty ( $tty)。

用于lsof找出会话中哪些进程的哪些 fd 对当前 tty 打开。

使用 gdb,附加到会话中的每个进程,执行一些操作call signal(1,1)以忽略 SIGHUP。对于会话领导者,您可能需要执行 a call dup2(0,1023)(假设 0 在 tty 上打开)以保持旧终端上的 fd 打开。然后对于每个进程,执行

set variable $fd = open("the-screen-window-tty",2)

然后对于旧终端上打开的每个 fd,执行以下操作:

call dup2($fd, that-fd)

进而:

call close($fd)
detach

附加到新终端的会话将以“睡眠”进程作为领导者(也是唯一的进程),但窗口大小调整、CTRL-C、CTRL-Z、作业控制、/dev/tty 之类的操作不会工作,可能还有一些我没有想到的更令人讨厌的副作用。

如果在 Linux 上,雷普特尔,由 @angus 在对您的问题的评论中提出,自动化该过程并通过创建一个新的 pty 并使其由您想要迁移的过程控制来解决上述缺点。不过,它只支持迁移一个进程AFAICT。

相关内容