lev*_*que 181 ssh gnu-screen terminal job-control disown
我在 SSH shell 上有一个正在运行的程序。我想暂停它并在我回来时能够取消暂停它的执行。
我想到的一种方法是将其所有权转移到屏幕外壳,从而使其在那里运行。
是否有不同的方式进行?
Gil*_*il' 125
您可以使用disown内置命令从 shell 中撤销程序的“所有权” :
# press Ctrl+Z to suspend the program
bg
disown
Run Code Online (Sandbox Code Playgroud)
然而,这只是告诉外壳SIGHUP程序在外壳程序退出时不要向程序发送信号。程序将保留它与终端的任何连接,通常作为标准输入、输出和错误流。无法将它们重新连接到另一个终端。(Screen通过为每个窗口模拟一个终端来工作,因此程序附加到屏幕窗口。)
通过在调试器中附加程序(即使用ptrace)并使其调用open,dup和,可以将文件描述符重新附加到不同的文件close。有一些工具可以做到这一点;这是一个棘手的过程,有时他们反而会使过程崩溃。可能情况包括(从答案收集链接我怎么能否认正在运行的进程,并将其关联到一个新的屏幕外壳?而且我可以nohup的/屏幕一个已经启动的进程?):
小智 85
使用 GNUscreen是您最好的选择。
首次登录时启动屏幕运行 - 我运行screen -D -R,运行您的命令,然后断开或挂起它,CTRL-Z然后按CTRL-Athen与屏幕断开连接D。
当您再次登录机器时,通过运行重新连接screen -D -R。您将处于与以前相同的外壳中。jobs如果这样做,您可以运行以查看挂起的进程,然后运行%1(或相应的作业 #)再次将其置于前台。
jof*_*fel 71
要在终端之间移动一个进程或重新附加一个不拥有的进程,您可以使用例如reptyr。
dai*_*isy 27
我最喜欢的解决方案是使用tmux,您可以分离会话,然后将其重新附加到另一个终端中。
当您从上一个会话分离时,您可以安全地关闭终端;稍后用于tmux attach返回会话,即使您已注销。
yun*_*zen 12
如果你只是想暂停它然后重新启动,你可以使用killwithSTOP或CONTsignal 。
首先找出进程PID
$ ps aux
Run Code Online (Sandbox Code Playgroud)
然后将信号发送到进程中列出的那个PID
$ kill -STOP <PID>
$ kill -CONT <PID>
Run Code Online (Sandbox Code Playgroud)
小智 10
ThomasHabets 的“injcode”似乎正是我需要的:
https://github.com/ThomasHabets/injcode
injcode 程序允许将任意代码注入到正在运行的进程中,无论您是否事先知道并且正在运行 screen 或 tmux
从自述文件:
示例 1:将 irssi 从一个终端移动到另一个终端
也许把它移到屏幕上。
首先在一个终端中启动 irssi。
在另一个终端运行 injcode:$ injcode -m retty
Irssi 现在应该移动到第二个终端,包括拥有一个新的控制终端。