アプリケーションが停止したら、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を処理します。信号を処理するには、他の機能を使用できます。

信号に対する良い答えもあります。さまざまな信号が送信される原因は何ですか?

サービスが何かを行うことを期待し、サービスが停止している間もその作業を続けるのは間違ったデザインパターンのように見えるので、この問題に対するアプローチを変更することを検討してください。

おすすめ記事