it-swarm.cn

如何放弃正在运行的进程并将其关联到新的屏幕外壳?

我在SSH Shell上有一个正在运行的程序。我想暂停它,并在我回来时能够取消暂停它的执行。

我想到的一种方法是将其所有权转移到屏幕Shell,从而使其在其中运行。

有其他方法可以进行吗?

164
levesque

使用GNU screen)是您最好的选择。

首次登录时开始运行屏幕-我运行screen -D -R,运行您的命令,然后通过CTRL-Z断开或挂起它,然后先按CTRL-A然后按D断开与屏幕的连接。

当您再次登录计算机时,请通过运行screen -D -R重新连接。您将与以前在同一Shell中。如果执行了此操作,则可以运行jobs来查看挂起的进程,然后运行%1(或相应的作业号)再次使其处于前台。

88
Andrew Yochum

您可以使用 disown 内置的命令从Shell撤消程序的“所有权”:

# press Ctrl+Z to suspend the program
bg
disown

但是,这仅告诉Shell在Shell退出时不要向程序发送SIGHUP信号。该程序将保留与终端的任何连接,通常作为标准输入,输出和错误流。无法将它们重新连接到另一个终端。 ( Screen 通过为每个窗口模拟一个终端来工作,因此程序会附加到屏幕窗口。)


通过将程序附加到调试器中(即使用 ptrace )并将其称为opendupclose。有一些工具可以做到这一点。这是一个棘手的过程,有时它们会使该过程崩溃。可能性包括(从答案中收集的链接 我如何放弃正在运行的进程并将其关联到新的屏幕外壳?我是否可以为已经启动的进程Nohup/screen? =):

116

要在终端之间移动流程或重新连接不使用的商品,您可以使用例如 reptyr

67
jofel

我最喜欢的解决方案是使用tmux,您可以分离会话,然后将其重新连接到另一个终端。

与上一个会话分离时,可以安全地关闭终端。以后使用tmux attach返回会话,即使您已注销也是如此。

28
daisy

还有一个名为 retty 的小实用程序,可让您将正在运行的程序重新连接到另一个终端。

21
adamg

我不定期使用它,但是 neercs 声称支持此功能。这是一个类似于screen的程序,具有诸如更好的窗格管理之类的其他高级功能,但是它提供的主要功能是能够将过程导入到窗格中

19
Michael Mrozek

如果您只想暂停它并随后重新启动,则可以将killSTOPCONT信号一起使用。

首先找出与

$ ps aux

然后将信号发送到该进程列出的PID

$ kill -STOP <PID>

$ kill -CONT <PID>
9
yunzen

ThomasHabets的“ injcode”似乎正是我需要的东西:

https://github.com/ThomasHabets/injcode

Injcode程序允许将任意代码注入到正在运行的进程中,无论您是否事先知道并正在运行屏幕或tmux

从自述文件:

示例1:将irssi从一个终端移到另一终端

也许将其移到屏幕上。

首先在一个终端中启动irssi。

在另一个终端中运行injcode:$ injcode -m retty

Irssi现在应该移至第二个终端,包括拥有一个新的控制终端。

9
user2688272

这为我工作:

  1. bg的过程
  2. jobs -l查找进程号
  3. tmux启动Shell窗口管理器
  4. reptyr -L PROCESSNUMBER

reptyr-L是使它起作用的必要条件:

-L Like '-l', but also redirect the child's stdio to the slave.

由于此错误:

$ reptyr 30622

[-] Unable to open the tty in the child.
Unable to attach to pid 30622: Permission denied

和-L

$ reptyr -L 30622
Opened a new pty: /dev/pts/4
1
kqw