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

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的/屏幕一个已经启动的进程?):

  • 为什么不 [`disown -h`](http://stackoverflow.com/a/625436/819417)? (4认同)

小智 85

使用 GNUscreen是您最好的选择。

首次登录时启动屏幕运行 - 我运行screen -D -R,运行您的命令,然后断开或挂起它,CTRL-Z然后按CTRL-Athen与屏幕断开连接D

当您再次登录机器时,通过运行重新连接screen -D -R。您将处于与以前相同的外壳中。jobs如果这样做,您可以运行以查看挂起的进程,然后运行%1(或相应的作业 #)再次将其置于前台。

  • 我认为这不能回答问题。问题以“*我有一个程序正在运行*”开头。这个答案假设它还没有运行...... (42认同)
  • 是的,他明确写道他想将其纳入屏幕会话:-) (2认同)

jof*_*fel 71

要在终端之间移动一个进程或重新附加一个不拥有的进程,您可以使用例如reptyr

  • 这太棒了; 它应该可以解决朋友的困境,即通过直接在 ssh 中运行它然后需要上火车来不断丢失她的工作。*“糟糕,忘记使用屏幕了。又一次。”* (5认同)
  • +1 虽然接受的`screen` 答案当然是理想的,但它实际上并没有回答这个问题,它特别要求一种将当前正在运行的进程_move_ 到`screen` 等的方法。另请参阅此答案:http://serverfault.com/a/284795 (3认同)
  • 是的,救了它,谢谢!我阅读了作者的网站,它如何比类似或旧的工具更好地工作,例如。对于 ncurses 程序。 (2认同)
  • 绝对的救星。允许我重新连接到正在等待用户确认的运行 apt dist-upgrade。 (2认同)

dai*_*isy 27

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

当您从上一个会话分离时,您可以安全地关闭终端;稍后用于tmux attach返回会话,即使您已注销。


小智 24

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


Mic*_*zek 20

我不经常使用它,但neercs声称支持这一点。这是一个screen类似程序,具有各种奇特的功能,例如更好的窗格管理,但它提供的主要功能是能够将进程导入到窗格中

  • 有趣的。它确实很脏(`ptrace`),但它不只是操作文件描述符,它还分叉了进程。它能够抓取`find /`,但会导致交互式bash 崩溃。 (2认同)

yun*_*zen 12

如果你只是想暂停它然后重新启动,你可以使用killwithSTOPCONTsignal 。

首先找出进程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 现在应该移动到第二个终端,包括拥有一个新的控制终端。