正如下面所讨论的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_HUP
或SIG_INT
父(java)进程正在退出。
您可以尝试运行它,nohup
这样它就会忽略 SIG_HUP 信号。您还可以包括:
trap 'echo "Got sigint"' INT
在您的.sh
文件中,因此它不会以正常方式退出,而是通过回显文本来处理 SIG_INT。随意使用任何其他函数来处理信号。
这里关于信号也有很好的答案:是什么原因导致发送各种信号?
请考虑改变解决此问题的方法,因为当您期望服务执行某些操作并在服务停止时继续执行该操作时,这看起来是一个糟糕的设计模式。