可能的重复:
如何否认正在运行的进程并将其关联到新的屏幕外壳?
在screen
会话中运行长进程是一种很好的做法,以保护它们免受会话挂起的影响。但是,如果我已经有一个正在运行的进程而我只是忘记运行,我该screen
怎么办?是否有可能以某种方式“捕获”当前会话并用 保护它screen
?
并不真地。
你能得到的最接近的是:
启动一个新的屏幕窗口,运行:
trap '' INT HUP
exec sleep 99999999
Run Code Online (Sandbox Code Playgroud)
在里面。记录该窗口的 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)
Run Code Online (Sandbox Code Playgroud)
然后对于旧终端上打开的每个 fd,执行以下操作:
call dup2($fd, that-fd)
Run Code Online (Sandbox Code Playgroud)
进而:
call close($fd)
detach
Run Code Online (Sandbox Code Playgroud)
附加到新终端的会话将以“睡眠”进程作为领导者(也是唯一的进程),但窗口大小调整、CTRL-C、CTRL-Z、作业控制、/dev/tty 之类的操作不会工作,可能还有一些我没有想到的更令人讨厌的副作用。
如果在 Linux 上,@angus 在对您的问题的评论中提出的 reptyr 会自动执行该过程,并通过创建一个新的 pty 并使其由您要迁移的进程控制来解决上述缺点。不过,它只支持迁移一个进程AFAICT。