当应用程序停止时,通过 java 应用程序保持反向 SSH 隧道打开

当应用程序停止时,通过 java 应用程序保持反向 SSH 隧道打开

正如下面所讨论的StackOverflow问题我正在创建一个启动反向 SSH 隧道的 Java 程序。我创建了一个/root/reverse.sh启动子 shell 并创建分离的 ssh 反向会话的脚本:

#!/bin/bash
( /usr/bin/sshpass -p mypassword ssh -f -N -M -S /tmp/socketuser000.000.000.000 -p 0000 [email protected] -R 21022:localhost:22 -R 21080:localhost:80 -o StrictHostKeyChecking=no )

然后这个脚本从 java 执行:

Process process = Runtime.getRuntime().exec("/bin/bash /root/reverse.sh");
int result = process.waitFor();

连接工作正常,当我停止注册为系统服务的 java 程序时,问题出现了:

systemctl stop myapp

当 java 进程被终止时,反向 ssh 连接也会被终止。我已经检查过pstree反向 ssh 进程父进程是 PID 1 而不是 Java。

$ pstree -sg 2185
systemd(1)───ssh(2185)

我不明白为什么当我杀死 Java 进程时,ssh 进程也会被杀死,因为它不是 Java 进程的子进程。为什么会出现这种情况?这与进程组有关吗?如何防止 ssh 进程被杀死?

答案1

您的进程正在获取SIG_HUPSIG_INT父(java)进程正在退出。

您可以尝试运行它,nohup这样它就会忽略 SIG_HUP 信号。您还可以包括:

trap 'echo "Got sigint"' INT

在您的.sh文件中,因此它不会以正常方式退出,而是通过回显文本来处理 SIG_INT。随意使用任何其他函数来处理信号。

这里关于信号也有很好的答案:是什么原因导致发送各种信号?

请考虑改变解决此问题的方法,因为当您期望服务执行某些操作并在服务停止时继续执行该操作时,这看起来是一个糟糕的设计模式。

相关内容