
長期実行コマンドを実行するSSHセッションを開始するときのCtrl+(SIGINT)処理Cはどうなりますか?
SSHセッションが閉じられていることがわかりますが、誰が最初にSIGINTを受け取ったかはわかりません。そうでしたか?
リモート長期実行コマンド?つまり、(a)リモートコマンドのシグナルハンドラが呼び出され、リモートコマンドが停止し、(b)それを生成したシェルがコマンドが停止したことを検出して停止します。 (c) リモート sshd がシェルが停止したことを検出します。停止したため、接続が閉じます。
または
ローカルSSHは信号を受信し、接続を閉じます。
(1)が起きていると思いますが、確認したいです。
また、この場合、シェルのSIGINT処理に何が起こるのかわかりません。たとえば、私は...
ssh remote 'while true ; do sleep 1 ; date ; done'
とCtrl+をC押すとリモート接続が切断されます。Ctrl+以降にアクティブになっているシェルでリモートコマンドを実行する方法はありますかC?つまり、この場合はループを停止してリモートシェルで作業を続行できますか?
答え1
ssh
さまざまな方法で呼び出すことができ、それぞれは端末から開始された信号に応答します(例Ctrl-C:
ssh remotehost
対話型セッションがで実行されますremotehost
。クライアント側では、stdinで使用されるttyを "raw"モードに設定し、リモートホストにpseudo-ttyを割り当て、シェルをログインシェルとして実行しようとしていますssh
。sshd
-bash
生モードを設定すると、通常、信号を送信する文字(たとえば、および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-CSIGINTssh
を受け取り、Connection to remotehost closed
メッセージも送信せずにすぐに終了します。これらの
your_shell -c "command args ..."
プロセスはリモートホストでまだ実行されている可能性があります。。彼らは自分で終了するか、プロセスが現在閉じているsshソケットにデータを書き込もうとし、それによって(通常)致命的なSIGPIPE信号が送信されます。