今天是周日,我在办公室留下了一个正在运行的 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
我的问题的独特部分是,我明确要求分离程序,而无需访问创建该程序的终端。
答案1
调用reptyr
足以分离终端,但必须
sudo reptyr -T $PID
从man reptyr
:
-T
使用另一种附加模式“TTY 窃取”。
在此模式下,reptyr 不会 ptrace(2) 目标进程,但会尝试发现该进程 pty 的终端仿真器,并窃取 pty 的主端。
这种模式在许多情况下更加可靠和灵活(例如,它可以将所有进程附加到 tty 上,而不仅仅是单个进程)。
然而,作为一个缺点,sshd(8) 的子级不能通过 -T 连接,除非以 root 身份运行reptyr。看 ⟨https://blog.nelhage.com/2014/08/new-reptyr-feature-tty-stealing/⟩ 了解有关 tty 窃取的更多信息。