tmuxを実行してからtmuxプロセスを「終了」すると、2つのbashプロセスが表示されます。セカンドカンは最初のカンとどのような関係がありますか?どうやって殺すの?

tmuxを実行してからtmuxプロセスを「終了」すると、2つのbashプロセスが表示されます。セカンドカンは最初のカンとどのような関係がありますか?どうやって殺すの?

質問が示すように、セッション、プロセス、プロセスグループなどをよりよく理解しようとしています。 tmuxを使用しながら経験したいくつかの問題は次のとおりです。

  1. tmuxを開いてpsを実行すると、2つのbashプロセスが表示されます。正しく理解すると、最初のbashプロセスは親シェルに対応し、2番目のbashプロセスはtmuxで開かれたプロセスですか?

  2. tmuxプロセスを使用すると、kill端末が親シェルに戻るように見えますが、psを再度実行すると2つのbashプロセスが表示されます。私の考えでは、2番目のbashプロセスはtmuxが開かれたプロセスですが、もはやその端末の対応するプロセスに接続されていないようです。 2番目のbashプロセスは、プロセスグループとセッションの観点から最初のbashプロセスとどのように関連していますか?

  3. kill2番目のbashプロセスをどのように実行しますか? PIDで実行してもkill何も起こらないようです。あるシェルから端末を切り離して別のシェルに切り替える方法もありますか?

  4. tmuxを開くと、Ctrl+Dtmuxと2番目のbashプロセスの両方が正常に終了します。 tmuxが閉じる前にbashプロセスを終了するようにシグナルを送信します。なぜこれがkill

macOS端末のbashシェルでtmuxを実行しています。シェルでtmuxと入力して実行しました。 tmuxが端末で開かれると、psを実行します。 tmuxのpidを取得したら、kill [pid]を実行してからpsを再度実行します。私はtmuxを設定したことがないので、.tmuxrcファイルがデフォルトのままになると思います。

答え1

ステップ1:tmuxを実行する

最初は端末を開き、その中でbashを実行します。私はそれを生bashと呼びます。

tmuxもともとbashから逃げました。 Tmuxは、tmuxサーバーとtmuxクライアントという2つのプロセスを実行します。これを行う理由は、tmuxセッションから切り離して後で再接続できるためです。これがtmuxの重要な機能です。 tmux クライアントは、接続セッションの端末に接続されます。サーバーはtmuxウィンドウで実行されるプロセスを実行します。セッションでdetach()を実行すると、クライアントはC-b dシャットダウンされますが、そのセッションで実行されているサーバーとプロセスは引き続き実行されます。 2つのtmuxプロセスに加えて、まだtmuxセッションを開始していないと仮定すると、シェルを実行するtmuxウィンドウを使用して新しいセッションが作成されます。これが2番目のbashです。

この時点で、プロセスツリーの関連部分は次のとおりです。


        ├─tmux: server───bash───pstree
        └─xterm───bash───tmux: client

これはpstreeLinuxのコマンドです。 macOSで同様のディスプレイを入手するには、次を参照してください。https://apple.stackexchange.com/questions/11770/linux-ps-f-tree-view-equivalent-on-osx。は元のbashを実行する端末で、xterm元のbashで実行してtmux: client開始されたtmuxクライアントです。これはtmuxクライアントによって起動されたtmuxサーバーで、その子は私が実行している2番目のbashです。tmuxtmux: serverbashpstree

psLinuxでは、内部tmuxの出力は次のようになります。

    PID TTY          TIME CMD
    108 pts/56   00:00:00 bash
    153 pts/56   00:00:00 ps

デフォルトでは、Linuxはps現在端末で実行されているプロセスのみを表示します。だから私はそれを見る。 FreeBSDで、そしてmacOSでも期待しています。 (私はこれをシェルがzshのシステムで実行しているので、bashの代わりにzshと言います。)

19690  0  Is   0:00.36 /usr/local/bin/zsh
20046  0  I+   0:00.01 tmux: client (/tmp//tmux-1001/default) (tmux)
20049  1  Rs   0:00.06 /usr/local/bin/zsh
20138  1  R+   0:00.01 ps

BSDがpsより多くのプロセスを表示するのは、基本的にすべての端末に接続されているプロセスを表示するためです。 (技術用語では「制御端末を使用する」プロセスです。)tmuxサーバなど端末にまったく接続されていないプロセスは表示しません。

関連するすべてのプロセスを確認し、それに関する追加情報を取得するには、psいくつかのオプションを使用して実行します。関連データを表示するためのオプションは、UNIXのバリエーションによって少しずつ異なります。私はLinuxとFreeBSDを表示します。 macOSはおそらくFreeBSDに近いですが、少し異なる場合があります。 Linuxでps x -o pid,ppid,tty,comm f関連プロセスでフィルタリングされた出力は次のとおりです。

    PID    PPID TT      COMMAND
    107       1 ?       tmux: server
    108     107 pts/1    \_ bash
    154     108 pts/1        \_ ps
      3       1 ?       xterm
      6       3 pts/0    \_ bash
    105       6 pts/0        \_ tmux: client

FreeBSDからps -U $(id -u) -A -o pid,ppid,tty,command -d(macOSでは削除する必要があり、ツリーデモ-dは取得できません)(再びフィルタリングされているため、FreeBSDではリモートでログインしたため、元のzshは提供された端末にありますsshd):

  PID  PPID TTY   COMMAND
19689 19687 -     sshd: gilles@pts/0 (sshd)
19690 19689 pts/0 - /usr/local/bin/zsh
20046 19690 pts/0 `-- tmux: client (/tmp//tmux-1001/default) (tmux)
20048     1 -     tmux: server (/tmp//tmux-1001/default) (tmux)
20049 20048 pts/1 - /usr/local/bin/zsh
20149 20049 pts/1 `-- ps -U 1001 -A -o pid,ppid,tty,command -d

どちらの場合も、6つのプロセスを見ることができます。

  • 端末エミュレータ提供pts/0
  • pts/0.
  • tmux クライアントはpts/0ソースシェルで実行され、実行されます。
  • ティモックスサーバー。端末では実行されません。対応する親プロセス(PPID)はprocess1です。 (これは、tmuxクライアントがサーバーを起動したときにデュアルフォークを実行するために発生します。つまり、子プロセスを作成し、そのプロセス自体が子プロセスを作成してすぐに終了します。)中間プロセスが終了すると、孫プロセスが孤児プロセスになります。内部につまり、プロセス1です。 )
  • tmux 内で実行されるシェルです。単一のtmuxウィンドウ(たとえば、端末)内で実行されますpts/1
  • pstmux 内のシェル内で実行されます。

ステップ2:tmuxを終了

tmux プロセスを終了します。しかし、どれ?私たちは上記の2つがあることを見ました。また、上記でmacOSには、ps端末で実行されているすべてのプロセスを表示するオプションがないことを確認しました。したがって、tmux クライアントを表示して終了します。これはセッションから分離するのと同じです。 tmux サーバーはまだ実行中です。これがtmuxを使用する理由の1つです。たとえば、クライアントが実行されていた端末が消えてクライアントが終了しても、セッションは実行を続けます。

ステップ3:セッションを再接続する

を使用して既存のtmuxセッションを表示できますtmux list-sessions。を使用して再接続できますtmux attach。複数のセッションがある場合は、後でセッション番号を渡して接続するセッションを選択できますtmux attach。たとえば、説明したセッションtmux attach 0に接続します。tmux list-sessions0: 1 windows (created …) …

セッションを接続せずに終了するには、を使用できますtmux kill-sessiontmux kill-serverすべてのセッションを終了するコマンドもあります。

ステップ4:正常に終了

Ctrl+D キーを押すか tmux 内にシェルを入力すると、exitシェルが終了します。 tmux ウィンドウの基本プロセスが終了すると、tmux はウィンドウを閉じます。 tmux が最後のウィンドウを閉じると、セッションは終了します。

答え2

私はデフォルト設定でFedora 32を実行しています。

tmuxを開いてpsを実行すると、2つのbashプロセスが表示されます。

tmux自体はbashの子ですが、別のシェル(セッションを分離できるアプリケーションの全体的なポイント)を提供する必要があるため、別のbashインスタンスを作成します。

tmuxプロセスを終了するとターミナルが親シェルに戻るように見えますが、psを再実行すると2つのbashプロセスが表示されます。

どのように殺すかによって異なります。

tmuxは独自のサブプロセスを作成し、シェルを作成します。

子tmuxを終了すると、子bashが終了し、bashプロセスが残ります。

親tmuxを終了すると、子tmuxはその下でbashプロセスを実行し続けます。つまり、2つのbashプロセスが得られます。

答え3

会話を理解する際の環境は少し特別ですtmux。主にそのように設計されたからです。通常、プロセスを終了すると、すべての子プロセスがシステムによって収集(終了)されます。 (これは実際に起こったことを大幅に単純化したものであり、最終結果は特定の状況で撮影された場合にのみ実際に正しいと見なすことができます。)

はいtmux、この配列は変更されました。tmuxシェルを起動し、そのセッションを切断してログアウトし、後で再度ログインして同じセッションに再接続できるように設計されています。だから親が死んでも子供は生かしてくれる。

特にあなたの場合は、プロセス、プロセスで始まりますbash。これが現在のシェルです。を呼び出すと、tmux現在のシェルは名前付き子項目を開始し、tmux自動的tmuxに独自の子項目を開始しますbash。この2番目はコマンドをbash実行する場所です。ps元のシェルを終了すると、tmux実際にはセッションは終了せず、tmux接続のみが終了します。したがって、孫シェルはtmuxセッションで実行され続け、親シェルに再ダンプされます。

既存のセッションにtmux接続したり切断したりする方法と、より効率的に使用する方法については、マニュアルページを参照してください。tmuxtmux

関連情報