シェル終了時のバックグラウンドSSH終了

シェル終了時のバックグラウンドSSH終了

(制御ソケットを介して)接続共有のためにバックグラウンドで実行されているbashプロファイルスクリプトからSSHを生成しようとしています。私が経験している問題は、TTYが閉じられた後(またはより直接的に親bashシェルが終了した後)、SSHがまだ実行されないようにする安定した方法です。

私はシェルが正常にシャットダウンしたとき(SSHを終了するために)コマンドを実行できることを知っていますが、シェルが閉じる機会がない可能性のあるすべてのシナリオを処理しようとしています。

これを行う賢明な方法はありますか?

私の最高のアイデアは

ssh -o PermitLocalCommand=yes -o LocalCommand='cat >/dev/null; kill $PPID' $HOST &

ただし、成功した実行後にバックグラウンドに移動するコマンドのみが必要なため、これは機能しません。または、SSHが完了した後はバックグラウンドでのみ機能するため、シェルは-fN代わりに使用できません。&-fLocalCommand

また、リモートホストでコマンドを実行しないようにしています。そうでなければ、私は次のことをすることができますssh -fN $HOST 'cat >/dev/null'

答え1

シェルがログインシェルの場合は、~/.bash_logoutファイルでデフォルトのSSH接続を停止できます。

ssh -O exit hostname

シェルがログインシェルでない場合は、SSHを作成した直後に〜/ .bashrcファイルにトラップを設定できます。

ssh -fN hostname
trap 'ssh -O exit hostname' EXIT

答え2

私自身の質問に答えると、私はそれを嫌います。

私が思いついた解決策は、ControlPersist=3600マスターSSHプロセスを開始するときに使用することです。これにより、シェルが正常にシャットダウンされず、sshをシャットダウンしない限り、1時間アクティビティがないと自動的に閉じます。シャットダウン時にSSHを完全にシャットダウンするためにまだトラップを使用していますが。

ssh -o ControlMaster=yes -o ControlPersist=3600 -o ControlPath=/tmp/ssh-%u-%h-%p-%r -Nf $HOST
trap "ssh -o ControlPath=/tmp/ssh-%u-%h-%p-%r $HOST -O exit" exit

答え3

接続を切断した後もSSHセッションを実行し続けます。

これがあなたが探しているものかどうかはわかりませんが、SSHシェルを終了した後でもプログラムを実行し続けるのに役立ちます。

関連情報