
以下で議論するように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) プロセスが終了しています。
nohup
SIG_HUP信号を無視するように実行できます。以下を含めることもできます。
trap 'echo "Got sigint"' INT
ファイルでは.sh
通常の方法で終了せず、テキストをエコーしてSIG_INTを処理します。信号を処理するには、他の機能を使用できます。
信号に対する良い答えもあります。さまざまな信号が送信される原因は何ですか?
サービスが何かを行うことを期待し、サービスが停止している間もその作業を続けるのは間違ったデザインパターンのように見えるので、この問題に対するアプローチを変更することを検討してください。