我在SSH Shell上有一个正在运行的程序。我想暂停它,并在我回来时能够取消暂停它的执行。
我想到的一种方法是将其所有权转移到屏幕外壳,从而使其在其中运行。
还有其他方法可以进行吗?
我在SSH Shell上有一个正在运行的程序。我想暂停它,并在我回来时能够取消暂停它的执行。
我想到的一种方法是将其所有权转移到屏幕外壳,从而使其在其中运行。
还有其他方法可以进行吗?
Answers:
使用GNU screen
是您最好的选择。
首次登录时开始运行屏幕-我运行screen -D -R
,运行命令,然后使用断开连接或将其挂起CTRL-Z
,然后按CTRL-A
then 断开与屏幕的连接D
。
当您再次登录计算机时,通过运行重新连接screen -D -R
。您将和以前一样在同一外壳中。jobs
如果这样做,您可以运行以查看挂起的进程,然后运行%1
(或相应的作业#)再次将其挂起。
您可以使用disown
内置命令从外壳中撤消程序的“所有权” :
# press Ctrl+Z to suspend the program
bg
disown
但是,这仅告诉Shell SIGHUP
在退出时不要向程序发送信号。该程序将保留与终端的任何连接,通常作为标准输入,输出和错误流。无法将它们重新连接到另一个终端。(屏幕通过模拟每个窗口的终端来工作,因此程序会附加到屏幕窗口。)
通过将程序附加到调试器中(即使用ptrace
)并使其调用和open
,可以将文件描述符重新附加到其他文件。有一些工具可以做到这一点。这是一个棘手的过程,有时它们会使该过程崩溃。可能性包括(从答案收集的链接到我如何放弃正在运行的进程并将其关联到新的屏幕外壳?以及我是否可以对已经启动的进程进行nohup /筛选?):dup
close
disown
从作业控制列表中删除该过程。
disown -h
呢?
fg
和kill
它,看它是否在其自己的目的。
bzcat a.bz2 | grep text
)?Man for reptyr
表示它不支持将过程与孩子一起移动。
要在终端之间移动进程或重新挂接未使用的进程,可以使用例如reptyr。
我最喜欢的解决方案是使用tmux
,您可以分离会话,然后将其重新连接到另一个终端。
与上一个会话分离时,可以安全地关闭终端。以后tmux attach
,即使您已注销,也可以使用它返回会话。
我不经常使用它,但neercs声称支持这一点。这是一个screen
类似程序,具有多种花哨的功能,例如更好的窗格管理,但是它提供的主要功能是能够将过程导入到窗格中
ptrace
),但它不仅操作文件描述符,还分叉了该过程。它可以抓取find /
,但使交互式bash崩溃了。
ThomasHabets的“ injcode”似乎正是我需要的东西:
https://github.com/ThomasHabets/injcode
injcode程序允许将任意代码注入正在运行的进程中,无论您是否事先知道并正在运行屏幕或tmux
从自述文件:
示例1:将irssi从一个终端移到另一终端
也许将其移到屏幕上。
首先在一个终端中启动irssi。
在另一个终端中运行injcode:$ injcode -m retty
Irssi现在应该移到第二个终端,包括拥有一个新的控制终端。
这为我工作:
bg
过程jobs -l
查找过程号tmux
启动外壳窗口管理器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