tmux를 실행 한 다음 tmux 프로세스를`kill`하면 두 개의 bash 프로세스가 표시됩니다. 이 두 번째 bash는 첫 번째 bash와 어떻게 관련되며 어떻게 종료합니까?

NNNComplex

질문에서 언급했듯이 세션, 프로세스, 프로세스 그룹 등을 더 잘 이해하려고 노력하고 있습니다. tmux를 가지고 놀면서 알게 된 몇 가지 질문입니다.

  1. tmux를 열고 ps를 실행하면 두 개의 bash 프로세스가 표시됩니다. 내가 올바르게 이해한다면 하나의 bash 프로세스는 부모 쉘에 해당하고 두 번째 bash 프로세스는 tmux가 연 프로세스입니까?

  2. 내가 killtmux 프로세스 인 경우 터미널은 부모 쉘로 돌아가는 것처럼 보이지만 ps를 다시 실행하면 두 개의 bash 프로세스가 표시됩니다. 내 생각 에이 두 번째 bash 프로세스는 tmux가 열었지만 더 이상이 터미널에 연결되어 있지 않은 것입니까? 이 두 번째 bash 프로세스는 프로세스 그룹 및 세션 측면에서 첫 번째 프로세스와 어떤 관련이 있습니까?

  3. 어떻게 할 kill이 두 번째 bash는 과정? killPID로 실행 하는 것은 아무 일도하지 않는 것 같습니다. 또한 하나의 쉘에서 터미널을 분리하고 다른 쉘로 전환하는 방법이 있습니까?

  4. 나는한다면 Ctrl+DTMUX 공개, TMUX 모두 제대로 두 번째 bash는 프로세스 종료와 함께. tmux가 tmux가 닫히기 전에 bash 프로세스를 종료하라는 신호를 보내기 때문입니까? 이것이 kill.

macOS의 터미널에서 bash 셸에서 tmux를 실행했습니다. 쉘에서 tmux를 입력하여 실행합니다. tmux가 터미널에서 열리 자마자 ps를 실행합니다. tmux의 pid를 얻으면 kill [pid]를 실행 한 다음 ps를 다시 실행합니다. tmux를 구성한 적이 없기 때문에 .tmuxrc 파일이 여전히 기본값이라고 가정합니다.

Gilles 'SO- 그만 사악함'

1 단계 : tmux 실행

처음에는 bash가 실행중인 터미널이 열려 있습니다. 나는 이것을 원래의 bash라고 부를 것입니다.

tmux원래 bash에서 실행 합니다. Tmux는 tmux 서버와 tmux 클라이언트의 두 가지 프로세스를 실행합니다. 그 이유는 tmux 세션에서 분리했다가 나중에 다시 연결할 수 있기 때문입니다. 이것은 tmux의 핵심 기능입니다. tmux 클라이언트는 세션이 연결된 터미널에 연결합니다. 서버는 tmux 창에서 실행되는 프로세스를 실행합니다. 세션 ( C-b d) 에서 분리 하면 클라이언트는 종료되지만 세션에서 실행중인 서버와 프로세스는 계속 실행됩니다. 아직 tmux 세션을 시작하지 않았다고 가정하고 두 개의 tmux 프로세스 외에도 tmux쉘을 실행하는 하나의 창을 포함하는 새 세션을 만듭니다. 이것이 두 번째 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를 참조 하십시오 . xterm원래 bash를 실행 한 터미널이며 원래 bash에서 tmux: client실행 tmux하여 시작된 tmux 클라이언트 입니다. tmux: servertmux 클라이언트가 시작한 tmux 서버이고 그 자식 bash은 내가 실행 한 두 번째 bash pstree입니다.

Linux에서 다음은 ps내부 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몇 가지 옵션을 사용하여 실행 보겠습니다 . 관련 데이터를 보는 옵션은 유닉스 버전에 따라 약간 씩 다릅니다. 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 개의 프로세스를 볼 수 있습니다.

  • .NET을 제공하는 터미널 에뮬레이터입니다 pts/0.
  • 원래 쉘에서 실행 pts/0.
  • 에서 실행되는 tmux 클라이언트 pts/0는 원래 셸에서 시작되었습니다.
  • tmux 서버. 터미널에서 실행되지 않습니다. 부모 ( PPID)는 프로세스 1입니다. (tmux 클라이언트가 서버를 시작할 때 이중 포크 (double-fork)하기 때문에 발생합니다. 자체적으로 자식 프로세스를 생성 한 후 즉시 종료되는 자식 프로세스를 생성합니다. 중간 프로세스가 종료되면 손자가 고아가됩니다. 따라서 프로세스 1 인 init의해 채택됩니다 .)
  • tmux 내부에서 실행되는 셸. 터미널 인 단일 tmux 창 내에서 실행됩니다 pts/1.
  • ps tmux 내부의 셸 내부에서 실행됩니다.

2 단계 : tmux 종료

tmux 프로세스를 종료합니다. 하지만 어느 것? 위에서 두 가지가 있음을 보았습니다. 또한 macOS에서 ps옵션없이 터미널에서 실행중인 모든 프로세스를 보여줍니다. 그래서 당신은 tmux 클라이언트를보고 죽였습니다. 이것은 세션에서 분리하는 것과 같습니다. tmux 서버가 여전히 실행 중입니다. 이것이 tmux를 사용하는 이유 중 하나입니다. 예를 들어 클라이언트가 실행중인 터미널이 사라지기 때문에 클라이언트가 종료되면 세션이 계속 실행됩니다.

3 단계 : 세션 다시 연결

을 사용하여 기존 tmux 세션을 볼 수 있습니다 tmux list-sessions. 을 사용하여 다시 연결할 수 있습니다 tmux attach. 세션이 여러 개인 경우 세션 번호를 전달하여 연결할 세션을 선택할 수 있습니다 ( tmux attach예 : tmux attach 0tmux list-sessions설명 하는 세션에 연결) 0: 1 windows (created …) ….

연결하지 않고 세션을 종료하려면 tmux kill-session. tmux kill-server모든 세션을 죽이는 명령도 있습니다 .

4 단계 : 정상 종료

Ctrl + D를 누르거나 exittmux 내부의 쉘에 들어가면 쉘이 종료됩니다. tmux 창의 기본 프로세스가 종료되면 tmux가 창을 닫습니다. tmux가 마지막 창을 닫으면 세션이 종료됩니다.

이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.

침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

Related 관련 기사

뜨겁다태그

보관