回答:
いいえ、適切な強制終了方法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 - -15does - 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 間違っている
-9sshプロセスが正常に終了しないようにします。そのため、プロセスが強制終了されてもプロセスはそこにありautosshます。
なし-9はまだ悪いです、あなたが実行している複数のトンネルがある場合、pkillそれらをすべて殺します
正しい方法は、AUTOSSH_PIDFILEenv 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 dbserver1dbserver1への接続のみを強制終了し、
autossh --kill dbserverdbserver1、dbserver2など
autossh --kill dbserverを強制終了します。すべての autossh接続を強制終了します。
明確にするために、autosshによって開始されたSSHセッションのみを強制終了する必要があります。
ps aux | grep sshautosshとsshの両方のセッションを実行しているときに実行すると、autosshによって開始されたセッションはフルパス(/ usr / bin / sshおよび/ usr / lib / autossh / autossh)を使用することがわかります。
このスクリプトは、結果をspeicifcパスで開始されたプロセスにのみ一致させます。私(そして私はほとんどの人が想定している)が通常sshフルパスではなくタイプするので、これをしました。
これが他の人を助けることを願っています。
$(which autossh)単にではなく特定の理由はautossh?