窃取并重新连接正在运行的进程

Thr*_*iag 7 ssh r disown

今天是星期天,我把 R 的一个实例留在了办公室里。脚本运行完毕,我想在不去办公室的情况下保存我的工作区。我可以通过 ssh 连接到计算机,但我还没有在屏幕上运行该程序。

有没有办法通过 ssh 否认该进程(我无权访问程序正在运行的终端的 jobsid!)并使用 reptyr 重新附加它?Reptyr 和 reptyr -T 在没有事先否认该过程的情况下不起作用

28845 3diag       20   0  139.3m  10.4m   0.0  0.1   0:12.06 S  `- urxvtd                                                                                      
 5327 3diag       20   0   16.4m   4.6m   0.0  0.1   0:00.02 S      `- bash                                                                                    
 5335 3diag       20   0 3499.3m 3.244g   0.0 43.3 171:57.89 S          `- R 
Run Code Online (Sandbox Code Playgroud)

我的问题的独特部分是我明确要求在无法访问创建程序的终端的情况下分离程序。

Thr*_*iag 9

调用reptyr足以分离终端,但必须

sudo reptyr -T $PID
Run Code Online (Sandbox Code Playgroud)

来自man reptyr

-T

使用另一种附加模式“TTY 窃取”。

在这种模式下, reptyr 不会 ptrace(2) 目标进程,而是会尝试发现该进程的 pty 的终端模拟器,并窃取 pty 的主端。

这种模式在许多情况下更加可靠和灵活(例如,它可以将所有进程附加到一个 tty 上,而不仅仅是单个进程)。

然而,不利的一面是,除非 reptyr 以 root 身份运行,否则无法通过 -T 附加 sshd(8) 的子项。看 ?https://blog.nelhage.com/2014/08/new-reptyr-feature-tty-stealing/ ? 有关 tty 窃取的更多信息。