実行時間の長いコマンドを実行するSSHセッションを開始すると、どうなるか Ctrl+C (SIGINT)処理?
SSHセッションが閉じていることがわかりますが、最初にSIGINTを取得するのは誰なのかわかりません。
リモートの長期実行コマンド?つまり、(a)リモートコマンドのシグナルハンドラーが呼び出されてリモートコマンドを停止します。(b)コマンドを停止したことを検出したシェルは、コマンドが停止したことを検出します。また、(c)リモートのsshdがシェルの停止を検出します。接続を閉じます
または
ローカルsshがシグナルを受信し、接続を閉じます。
(1)は起こっていると思いますが、確認したいです。
この場合、SIGINTのシェル処理で何が発生するかも不明です。たとえば、私が...
ssh remote 'while true ; do sleep 1 ; date ; done'
そして Ctrl+C、その後、リモート接続がドロップされます。後で生き続けるシェルの下でリモートコマンドを実行する方法はありますか Ctrl+C?つまり、この場合、ループを停止して、リモートシェルでの作業を続行できるようにしますか?
ssh
はいくつかの異なる方法で呼び出すことができ、それぞれが次のような端末起動信号のわずかに異なる処理をもたらします Ctrl-C。
ssh remotehost
はremotehost
でインタラクティブセッションを実行します。クライアント側では、ssh
はstdinが使用するttyを「raw」モードに設定しようとし、リモートホストのsshd
は疑似ttyを割り当て、シェルをログインとして実行しますシェル(例:-bash
)。
Rawモードを設定すると、通常は信号を送信する文字( Ctrl-C そして Ctrl-\)代わりに、入力ストリームに挿入されるだけです。 ssh
は、そのような文字をそのままリモートホストに送信します。この場合、これらの文字はSIGINTまたはSIGQUITを送信し、通常はコマンドを強制終了して、リモートホストのシェルに戻ります。リモートシェルが有効である限り、ssh接続は有効です。
ssh -t remotehost command args ...
は、上記と同様にremotehost
でインタラクティブセッションを実行しますが、リモート側ではyour_Shell -c "command args ..."
が実行されます。上記のように、 Ctrl-C、それはリモートホストに送信され、コマンドはSIGINTを受信してすぐに終了し、その後リモートシェルが終了します。次に、リモートsshd
が接続を閉じ、ssh
がConnection to remotehost closed.
を報告します。
ssh remotehost command args ...
はremotehost
で非インタラクティブセッションを実行します。クライアント側では、ssh
はnot ttyをrawモードに設定します(パスワードまたはパスフレーズを読み取る場合を除いて)。入力した場合 Ctrl-C、ssh
はSIGINTを送信し、Connection to remotehost closed
メッセージを発行することなく直ちに終了します。
your_Shell -c "command args ..."
プロセスはリモートホストで実行されている可能性が高いになります。自分で終了するか、1つのプロセスが現在閉じているsshソケットにデータを書き込もうとすると、(通常は)致命的なSIGPIPEシグナルが送信されます。