[编辑]
让它变得简单。
我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
答案4
由于您的命令已准备好运行,因此您需要按下CTRL-Z
它将使其进入停止状态,程序未运行,但程序的状态已保存,并且可以随时恢复。
您可以通过运行命令来检查您的程序有什么作业 ID jobs
。一旦您识别出它,您就可以执行bg %your_prog_id
该操作,将您的程序发送到后台,并且即使您关闭会话也将继续运行,您现在可以退出,您的程序将继续运行。