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 が最後のウィンドウを閉じると、セッションは終了します。

おすすめ記事