我有一个在 SSH shell 上运行的程序。我想暂停它并能够在我回来时取消暂停它的执行。
我想到的一种方法是将其所有权转移到屏幕外壳,从而使其保持在那里运行。
有其他方法可以继续吗?
答案1
您可以使用以下命令从 shell 中撤销该程序的“所有权”disown
内置:
# press Ctrl+Z to suspend the program
bg
disown
然而,这只是告诉 shellSIGHUP
在 shell 退出时不要向程序发送信号。程序将保留与终端的任何连接,通常作为标准输入、输出和错误流。无法将它们重新连接到另一个终端。 (屏幕通过模拟每个窗口的终端来工作,因此程序附加到屏幕窗口。)
可以通过将程序附加到调试器中来将文件描述符重新附加到不同的文件(即使用ptrace
) 并使其调用open
,dup
和close
.有一些工具可以做到这一点;这是一个棘手的过程,有时他们会使进程崩溃。可能性包括(从答案中收集的链接如何否认正在运行的进程并将其关联到新的屏幕外壳?和我可以 nohup/screen 一个已经启动的进程吗?):
答案2
使用 GNUscreen
是您最好的选择。
首次登录时启动屏幕运行 - 我运行screen -D -R
,运行您的命令,然后断开连接或暂停它CTRL-Z
,然后按CTRL-A
then与屏幕断开连接D
。
当您再次登录计算机时,通过运行重新连接screen -D -R
。您将处于与以前相同的 shell 中。如果您这样做了,您可以运行jobs
查看挂起的进程,然后运行%1
(或相应的作业#)再次将其置于前台。
答案3
要在终端之间移动进程或重新附加已拒绝的进程,您可以使用例如雷普特尔。
答案4
还有一个名为的小实用程序雷蒂允许您将正在运行的程序重新连接到另一个终端。