如何设置终端停止时进程不被终止

如何设置终端停止时进程不被终止

[编辑]

让它变得简单。

java xxx...在机器A上使用putty调用从机器B连接。但是我无法到达机器B。如何从机器C连接机器A以设置java xxx...当机器B关闭时无法终止正在运行的进程?

[原来的]

我正在使用 putty 连接到服务器(机器 A),并且正在其上运行一个进程。但是我必须重新启动我的计算机(机器 B),这可能会终止连接以及腻子。因为我没有在正在运行的进程上设置 nohup,所以这可能会被终止。disown由于某些原因我无法使用putty进行设置。所以我想使用机器C打开putty连接到服务器(机器A)并设置我正在运行的进程,使其在重新启动机器B时不会被终止。

有什么办法可以做到这一点吗?我知道disown如果我使用相同的 shell 进程,我就可以使用。但现在不是这样了。

答案1

您可以将调试器附加到它以使进程忽略 SIGHUP 信号:

gdb --pid="$pid" --batch -ex 'call signal(1,1)' -ex detach

(其中$pid是该进程的 id)。您还可以扩展它以重定向其 stdout/stdin/stderr...,但是您也可以查看此处引用的有关将进程重新附加到另一个终端的其他问题(或reptyr在这个网站上搜索)。

另一种选择是挂起分配并驱动控制 java 进程的伪终端的进程。这样,即使 ssh 连接被终止,它也不会死,只要 java 不向终端写入太多内容,它就不会受到影响。

这是一个过程的测试sleep

$ pstree -sp "$(pidof sleep)"
init(1)───sshd(5701)───sshd(62826)───sleep(62842)
$ kill -s STOP 62826

现在终止 ssh 客户端,然后sleep仍在运行:

$ ps -fC sleep
UID        PID  PPID  C STIME TTY          TIME CMD
root     62842 62826  0 09:50 pts/8    00:00:00 sleep 100

sshd一旦您的 java 进程终止,您将需要恢复该进程,以便它可以干净地退出。

答案2

我想给kill命令一个机会并提供一些特定的信号,但还没有找到合适的信号来做到这一点。我想说你不能用内置的东西来做到这一点。然而有人写过代码:

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

答案3

就您而言,最好的方法是使用tmux或者screen

这是一个如何使用的示例tmux,屏幕几乎相同。

  1. 将 Putty 添加到您的服务器中
  2. 使用您最喜欢的包管理器安装 tmux
  3. 通过以下方式启动新的 tmux 会话:tmux
  4. 在 tmux 窗口中运行您的应用程序,例如:java -jar blah blah
  5. 通过按分离您的 tmux 会话CTRL-B D
  6. 下次你想检查java进程时(同一个putty窗口或从另一台机器的putty中):tmux atta

答案4

由于您的命令已准备好运行,因此您需要按下CTRL-Z它将使其进入停止状态,程序未运行,但程序的状态已保存,并且可以随时恢复。

您可以通过运行命令来检查您的程序有什么作业 ID jobs。一旦您识别出它,您就可以执行bg %your_prog_id该操作,将您的程序发送到后台,并且即使您关闭会话也将继续运行,您现在可以退出,您的程序将继续运行。

相关内容