回答:
いいえ、適切な強制終了方法autossh
は、単にプロセスautossh
を強制終了することです。
その理由は
# file $(which autossh)
/usr/bin/autossh: POSIX shell script, ASCII text executable
これautossh
は単なるシェルスクリプトであり、サービスではありません。最後の行で新しいプログラムを開始し、
exec /usr/lib/autossh/autossh "$@"
再びサービスではありません。exec
(あなたがそれをダブルチェックすることができバッシュハッカーのウィキ)、それは(次のコマンドを実行して、現在のシェルを置き換えるシェル組み込みコマンドで/usr/lib/autossh/autossh "$@"
新しいプロセスを起動せずに、この場合には)。したがって、停止する唯一の方法autossh
は、たとえば呼び出し元のスクリプトを強制終了することです
pkill -3 autossh
(-3フラグを使用することの重要性を指摘してくれたdviljoenに感謝します。以下を参照してください)。ちなみに、呼び出しコマンド(つまり、上記のコマンド)は、古い接続がドロップされたことを認識するとすぐに新しい接続を開始するため、接続の削除は機能しません。 ssh
SIGTERM
はデフォルトであり、それは15
です。SIGQUIT
は3
、superuser.com / questions / 352147 / what - -15
does - kill -3- meanおよびen.wikipedia.org/wiki/Kill_(command)を参照してください-また、FWIW、チェックしただけでシャットダウンしません。使用SIGTERM
できません。
pkill
、信号なし(= the default
)で使用しても終了しませんautossh
。
auto sshを実行するには:
AUTOSSH_PIDFILE=/var/run/tunnel.pid autossh
でそれを殺す:
kill pid
ところで
pkill -9 autossh
間違っている
-9
ssh
プロセスが正常に終了しないようにします。そのため、プロセスが強制終了されてもプロセスはそこにありautossh
ます。
なし-9
はまだ悪いです、あなたが実行している複数のトンネルがある場合、pkill
それらをすべて殺します
正しい方法は、AUTOSSH_PIDFILE
env var を設定し、kill
そのpidのみを設定することです
私はこれが回答されたことを知っていますが、上記のコメントに反して、使用pkill -3 autossh
してもsshdの子プロセスは殺されません。
.bashrc
ファイルでこの関数を使用します。
基本的に、autosshに--kill
引数を追加するようなものです。
if [ "$1" = "--kill" ]; then
ps aux |
grep -P "(/usr/bin/ssh|/usr/lib/autossh/autossh)\s.*$2" |
awk '{print $2}' |
xargs -r kill
else
$(which autossh) "$@"
echo "" # prevents line wrapping when you kill the ssh process
fi
あなたは実行することができますwhich ssh
し、which autossh
あなたのシステム上のパスをチェックします。
最初の引数がでない限り--kill
、引数をautosshに渡すだけです。
このスクリプトは、autosshおよびsshインスタンスを強制終了します。ポート転送を使用している場合、これは重要です。autosshインスタンスのみを強制終了してもトンネルは強制終了されず、最終的に切断された場合に再接続できなくなるためです。
特定のトンネルのみを強制終了するために、検索語(ホスト名)を指定することもできます。
autossh --kill dbserver1
dbserver1への接続のみを強制終了し、
autossh --kill dbserver
dbserver1、dbserver2など
autossh --kill dbserver
を強制終了します。すべての autossh接続を強制終了します。
明確にするために、autosshによって開始されたSSHセッションのみを強制終了する必要があります。
ps aux | grep ssh
autosshとsshの両方のセッションを実行しているときに実行すると、autosshによって開始されたセッションはフルパス(/ usr / bin / sshおよび/ usr / lib / autossh / autossh)を使用することがわかります。
このスクリプトは、結果をspeicifcパスで開始されたプロセスにのみ一致させます。私(そして私はほとんどの人が想定している)が通常ssh
フルパスではなくタイプするので、これをしました。
これが他の人を助けることを願っています。
$(which autossh)
単にではなく特定の理由はautossh
?