将已在运行的进程移至 Screen

Dev*_*lar 254 linux vnc gnu-screen

我的办公室工作经常看到我通过 VNC 连接到 Linux 机器。

有时我在控制台上启动远程作业,后来意识到它运行的时间比预期的要长得多。(应该首先在 Screen 下启动那个...)

我不想为了保持 VNC 会话打开而让我的工作站通宵运行;我想将已经在运行的远程作业移动到 Screen 会话中(在远程盒子上),这样我就可以关闭工作站(并在第二天早上重新连接)。

如果有的话,如何做到这一点?

小智 253

看看reptyr,它就是这样做的。github 页面包含所有信息。

reptyr - 一种用于“重新制作”程序的工具。

reptyr 是一个实用程序,用于获取现有正在运行的程序并将其附加到新终端。通过 ssh 启动了一个长时间运行的进程,但必须离开并且不想中断它?只需启动一个屏幕,使用 reptyr 抓取它,然后终止 ssh 会话并回家。

用法

爬虫PID

“reptyr PID”将获取 id PID 的进程并将其附加到您当前的终端。

附加后,该进程将从新终端获取输入并将输出写入新终端,包括 ^C 和 ^Z。(不幸的是,如果您将其作为后台处理,您仍然需要在旧终端中运行“bg”或“fg”。如果不修补您的 shell,这可能无法以合理的方式修复。)

  • 如果像我一样,您查看了上面的链接并简要考虑从源代码安装程序,请记住:它只是 Debian 系统上的“apt-get”。 (26认同)
  • 除非在最微不足道的情况下,否则不起作用:`无法附加。(这通常意味着 11690 有一个 suprocesses)` (9认同)
  • 这很好用,我以前怎么没见过这个? (5认同)
  • 这太棒了!如果可以的话,我会赞成 10 次!此外,RedHat 存储库中也提供了 reptyr。只需'yum install' 即可获得它。 (4认同)
  • 至少作为 root,你可以使用 `reptyr -T PID` (3认同)
  • Ubuntu 用户注意: reptyr 依赖于 ptrace(2) 系统调用来附加到远程程序。在 Ubuntu Maverick 及更高版本上,出于安全原因,默认情况下禁用此功能。您可以通过以 root 身份执行 `echo 0 > /proc/sys/kernel/yama/ptrace_scope` 临时启用它,或者通过编辑文件 `/etc/sysctl.d/10-ptrace.conf` 永久启用它,该文件还包含更多有关此设置的信息。来源:http://manpages.ubuntu.com/manpages/xenial/man1/reptyr.1.html (2认同)

ear*_*arl 51

你不能轻易做到这一点。我建议养成在打开控制台后做的第一件事时启动屏幕的习惯。

但是,对于您的实际问题,您还可以尝试另一件事:从终端启动您的工作后,通过输入 ctrl-z 和bg. 之后,将作业与它的父 shell 分离;在 bash 你会做的disown -h %<jobid>。之后,您可以安全地关闭终端,作业将继续运行。

  • 仅供参考:在_disown_-ing 过程之后,它可以在_screen_ 内_reptyr_-ed。 (11认同)
  • 这对我的情况非常有效。reptyr 和 retty 都未能获取进程,但我所需要的只是能够关闭终端并让进程继续运行。 (3认同)
  • 这杀死了我正在运行的程序:( (3认同)
  • 改进[评论](https://serverfault.com/questions/55880/moving-an-already-running-process-to-screen/55882#comment715009_55881) @Adam ([Adam](https://serverfault. com/users/219726/adam)):仅供参考:在“disown”进程之后,它可以被“reptyr”编辑(如[此答案](https://serverfault.com/a/284795/515968)中所述)) 在“屏幕”内。 (2认同)

Rob*_*lls 40

当您使用 Linux 时,在新启动的 screen 进程中使用 retty 怎么样?

$ screen -S my_process
$ retty $(pgrep my_process)
/redraw
Run Code Online (Sandbox Code Playgroud)

HTH

干杯,

  • 不知道retty,谢谢。然而,对于我想要的那种长期运行的工作,我有点不愿意使用一个自称“经过非常简单测试”的工具。我同意厄尔的解决方案。 (2认同)
  • 在 Gentoo 中看不到 retty (2认同)