autosshトンネルを停止/強制終了するにはどうすればよいですか?


17

autosshトンネルができたので、それを止める正しい方法は何ですか?

これを行う簡単な方法はないようです。この部分のドキュメントは不明です。

簡単な方法は、マシンを再起動することですか?これは正しいです?

回答:


21

いいえ、適切な強制終了方法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


1
実際には、-9なしでautosshを強制終了する必要があります。トンネルを介して接続がすでに確立されている場合、それを処理するために子sshdプロセスが生成されます。-9で親autosshを強制終了すると、sshdプロセスが残ります。トンネルは、sshdプロセスがタイムアウトするまで動作し続けます。killでデフォルトのシグナル(-3)を使用すると、正常にシャットダウンされ、生成されたsshdプロセスが一緒に処理されます。
dviljoen

HIとして-3デフォルトキル信号である、あなたが実際に明示的に渡す必要はありません-3、あなたはそれを省略することができます
アンドレス・Alcarraz

@AndrésAlcarrazあなたは本当にそれを確信していますか?SIGTERMはデフォルトであり、それは15です。SIGQUIT3superuser.com / questions / 352147 / what - -15does - kill -3- meanおよびen.wikipedia.org/wiki/Kill_(command)を参照してください-また、FWIW、チェックしただけでシャットダウンしません。使用SIGTERMできません。
ダニエルF

またpkill、信号なし(= the default)で使用しても終了しませんautossh
ダニエルF

@DanielFあなたにしている権利は、私は混乱していたY「デフォルトの信号(-3)」dvijoenコメントから
アンドレス・Alcarraz

5

auto sshを実行するには:

AUTOSSH_PIDFILE=/var/run/tunnel.pid autossh

でそれを殺す:

kill pid

ところで

pkill -9 autossh 間違っている

-9sshプロセスが正常に終了しないようにします。そのため、プロセスが強制終了されてもプロセスはそこにありautosshます。

なし-9はまだ悪いです、あなたが実行している複数のトンネルがある場合、pkillそれらをすべて殺します

正しい方法は、AUTOSSH_PIDFILEenv var を設定し、killそのpidのみを設定することです


スーパーユーザーへようこそ。最終段落は実際の回答であるように見えますが、質問の残りの部分は別の回答に対するコメントです。このサイトのQ&Aの性質を考えると、それが単独で立つことができるようにあなたの答えに十分な詳細を追加することは役に立ちます。貢献してくれてありがとう。ツアーをチェックするのを忘れないで。
私は言うモナの復活

4

プロセスを検索します。

ps aux | grep ssh

secon列はPIDnumberです

PIDによるプロセスの強制終了 :)

kill -9 PIDnumber

ルート権限がない場合は、sudoを使用します。


1

私はこれが回答されたことを知っていますが、上記のコメントに反して、使用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
メストレリオン
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.