애플리케이션이 중지되면 Java 애플리케이션을 통해 역방향 SSH 터널을 열어 둡니다.

애플리케이션이 중지되면 Java 애플리케이션을 통해 역방향 SSH 터널을 열어 둡니다.

아래에 논의된 바와 같이StackOverflow 질문역방향 SSH 터널을 시작하는 Java 프로그램을 만들고 있습니다. /root/reverse.sh서브셸을 시작하고 분리된 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 프로세스 상위 프로세스가 Java가 아닌 PID 1인지 확인했습니다 .

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

Java 프로세스를 종료할 때 Java 프로세스의 하위 프로세스가 아니기 때문에 ssh 프로세스도 종료되는 이유를 이해할 수 없습니다. 왜 이런 일이 발생합니까? 이것이 프로세스 그룹과 관련이 있습니까? SSH 프로세스가 종료되는 것을 방지하는 방법은 무엇입니까?

답변1

프로세스가 가져오는 중이 SIG_HUP거나 SIG_INT상위(java) 프로세스가 종료 중입니다.

nohupSIG_HUP 신호를 무시하도록 실행해 볼 수 있습니다 . 다음을 포함할 수도 있습니다.

trap 'echo "Got sigint"' INT

파일 에서 .sh일반적인 방법으로 종료되지 않고 텍스트를 에코하여 SIG_INT를 처리합니다. 신호를 처리하려면 다른 기능을 사용해도 됩니다.

신호에 대한 좋은 답변도 있습니다.다양한 신호가 전송되는 원인은 무엇입니까?

서비스가 어떤 작업을 수행할 것으로 예상하고 서비스가 중지된 동안 해당 작업을 계속 수행하는 것은 잘못된 디자인 패턴처럼 보이기 때문에 이 문제에 대한 접근 방식을 변경하는 것을 고려해 보십시오.

관련 정보