ssh -t
バックグラウンドジョブが完了するのを待つとどうなりますか?
例:
ssh user@example 'sleep 2 &'
sshが2秒後に返されるため、これは期待どおりに機能します。
ssh user@example -t 'sleep 2 &'
完了を待たずにsleep
すぐに返します。
誰でもこれの理由を説明できますか?ssh -t
返す前にすべてのバックグラウンドプロセスを完了する方法はありますか?
私のユースケースは、次のようにスクリプトを起動し、そのスクリプトが基本スクリプトがssh -t
完了した後もアクティブなままにする必要があるいくつかのバックグラウンドタスクを開始することです。これまではこれはssh -t
不可能でした。
ベストアンサー1
それ以外の場合は、-t
2つのパイプを介してsshd
リモートシェルのstdout(およびサブシェル)とstderrを取得しますsleep
(別のパイプを介してクライアントからの入力も送信します)。
sshd
ユーザーのログインシェルを開始したプロセスを待ちますが、そのプロセスが終了した後、stdoutパイプ(少なくともstderrパイプではなくopensshの場合)でeofを待ちます。
eofは、パイプの書き込み側プロセスに対して開いているファイル記述子がない場合に発生します。これは通常、stdoutが他にリダイレクトされていないすべてのプロセスが消えた場合にのみ発生します。
を使用すると、-t
パイプsshd
は使用されません。代わりに、リモートシェルとその子孫(stdin、stdout、stderr)とのすべての対話は、一対の擬似端末を使用して行われます。
擬似端末ペアの場合、sshd
マスターと対話するための同様のeof処理はありませんが、少なくとも一部のシステムは、疑似端末のスレーブ側にまだ開いているプロセスがあるかどうかを知るための代替方法を提供します(下記の@JdeBP注釈を参照)。 )、sshd
使用しないので、リモートユーザーのログインシェルを実行するプロセスが終了するのを待ってから終了します。
終了すると、ptyペアのマスター側が閉じます。これはptyが破壊されることを意味するので、スレーブ制御プロセスはSIGHUP(デフォルトで終了)を受け取ります。
編集する:最終結果は同じですが、最後の部分が正しくありません。バラより@UNIX.rootの答え正確に何が起こったのかを正確に説明してください。