長時間実行されるコマンドを実行する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
しない ttyをrawモードに設定します(パスワードまたはパスフレーズを読み込む場合を除く)。 Ctrl-Cと入力した場合 、ssh
Connection to remotehost closed
を発行しなくても、SIGINTが送信され、すぐに終了します。 メッセージ。your_shell -c "command args ..."
プロセスはリモートホストで実行されたままになる可能性があります 。自分で終了するか、1つのプロセスが閉じられたsshソケットにデータを書き込もうとします。これにより、(通常は)致命的なSIGPIPEシグナルが送信されます。