
背景:
- ssh経由でUbuntuサーバーに接続する
- tmuxを実行してデタッチする
tmux の PPID が 1 なのはなぜですか? tmux ランタイム メカニズムに関する情報はありますか?
答え1
tmux
はクライアント サーバー アーキテクチャで実行されます。シェルから実行すると、シェルの子であるクライアントが実行されます。(シェル以外から、たとえば から直接tmux
実行することも可能です。この詳細は何も変わりません)。tmux
sshd
tmux
クライアントは、ユーザーに関連付けられたサーバーを見つけようとしますtmux
。サーバーが見つからない場合、クライアントはエラーを報告したり (例tmux attach-session
)、サーバーを起動して (例tmux
は と同等のsole tmux new-session
)、ジョブを実行したりすることがあります。
クライアントの役割は、tmux
サーバーと通信して、サーバーに何かを実行させることです。
tmux
サーバーの起動が必要な場合は、サーバーclone(2)
自体を起動します。その結果生じた子プロセスはすぐにclone
再度起動し、終了します。最新のプロセスが実際のtmux
サーバーとなり、親が死亡しているためPPIDは1です中間プロセスの唯一の仕事は、サーバーをその祖先から「切り離す」ことであるように見えます。
tmux
サーバーが何らかのクライアントの直接の子でtmux
、クライアントが停止した後にのみ PPID 1 を取得する場合は、機能すると思います。 の全体的なポイントはtmux
、元のクライアントが切り離された後もサーバーが実行し続けることです。したがって、サーバーが何らかのクライアントの子である場合、遅かれ早かれ孤立する可能性が高くなります。また、一般にtmux
クライアントは任意のシェルまたは別のプロセスから実行できるため、そのシェルまたは別のプロセスは、その子の子を監視したり、シグナルを送信したりしようとする可能性があるため、できるだけ早くサーバーを孤立させるのは合理的なことです。
したがって、サーバーはほぼ即座に PPID 1 を取得します。サーバー内で実行するすべてのシェルまたは他のプロセスは、tmux
サーバーの子孫です。(再)接続すると、クライアントsshd
に表示される内容が表示されます。クライアント自体は、それを呼び出したシェル (またはその他) の子です。クライアントはサーバーと通信し、キーストロークをサーバーに渡し、ウィンドウの外観に関する情報を受け取り、それに応じて文字を出力します。
サーバーは、一度起動すると、その中のすべてのセッションが終了するまで実行されます。つまり、サーバーを正常に終了するには、ペインであるすべてのシェル (またはその他のプロセス) を終了する必要があります。
このアーキテクチャは、最初に呼び出された の環境tmux
が保持される理由を説明していますが、一般にtmux
クライアントの環境は重要ではありません。サーバーは最初の の孫として起動するtmux
ため、環境を継承できます。その後はすべてサーバーに依存します。サーバーが実行している限り、サーバーも新しく生成されたプロセス (ペイン) もこのクライアントの子孫ではないため、後のクライアントから直接継承されることはありません。私のこの答え。