tmux를 실행한 다음 tmux 프로세스를 "종료"하면 두 개의 bash 프로세스가 표시됩니다. 두 번째 쿵은 첫 번째 쿵과 어떤 관련이 있나요? 어떻게 죽이나요?

tmux를 실행한 다음 tmux 프로세스를 "종료"하면 두 개의 bash 프로세스가 표시됩니다. 두 번째 쿵은 첫 번째 쿵과 어떤 관련이 있나요? 어떻게 죽이나요?

질문에서 알 수 있듯이 세션, 프로세스, 프로세스 그룹 등을 더 잘 이해하려고 노력하고 있습니다. tmux를 사용하면서 겪은 몇 가지 문제는 다음과 같습니다.

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

  2. tmux 프로세스를 사용하면 kill터미널이 부모 쉘로 돌아가는 것 같은데 다시 ps를 실행하면 bash 프로세스가 2개가 보입니다. 내 생각엔 두 번째 bash 프로세스가 tmux가 연 프로세스인데 더 이상 해당 터미널의 해당 프로세스에 연결되어 있지 않은 것 같습니다. 두 번째 bash 프로세스는 프로세스 그룹 및 세션 측면에서 첫 번째 bash 프로세스와 어떤 관련이 있습니까?

  3. kill두 번째 bash 프로세스를 어떻게 실행합니까 ? PID로 실행해도 kill아무 일도 일어나지 않는 것 같습니다. 한 셸에서 터미널을 분리하고 다른 셸로 전환하는 방법도 있나요?

  4. tmux를 열면 Ctrl+Dtmux와 두 번째 bash 프로세스가 모두 정상적으로 종료됩니다. tmux가 닫히기 전에 bash 프로세스를 종료하라는 신호를 tmux가 보내기 때문입니까? 왜 이것이 kill.

macOS 터미널의 bash 쉘에서 tmux를 실행하고 있습니다. 쉘에서 tmux를 입력하여 실행했습니다. tmux가 터미널에서 열리면 ps를 실행합니다. tmux의 pid를 얻으면 kill [pid]를 실행한 다음 다시 ps를 실행합니다. 저는 tmux를 구성한 적이 없으므로 .tmuxrc 파일이 기본값으로 유지될 것이라고 생각합니다.

답변1

1단계: tmux 실행

처음에는 터미널을 열고 그 안에서 bash를 실행합니다. 나는 그것을 원시 bash라고 부릅니다.

tmux원래 bash에서 도망쳤습니다 . Tmux는 tmux 서버와 tmux 클라이언트라는 두 가지 프로세스를 실행합니다. 이렇게 하는 이유는 tmux 세션에서 분리했다가 나중에 다시 연결할 수 있기 때문입니다. 이것이 tmux의 핵심 기능입니다. tmux 클라이언트는 연결된 세션의 터미널에 연결됩니다. 서버는 tmux 창에서 실행되는 프로세스를 실행합니다. 세션에서 detach()를 수행하면 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. 은 원래 bash를 실행하는 터미널이고 xterm원래 bash에서 실행하여 tmux: client시작된 tmux 클라이언트 입니다. 이는 tmux 클라이언트에 의해 시작된 tmux 서버이고, 그 자식은 내가 실행하는 두 번째 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 프로세스를 종료합니다. 하지만 어느 것? 우리는 위에서 두 가지가 있다는 것을 보았습니다. 또한 위에서 macOS에는 ps터미널에서 실행 중인 모든 프로세스를 표시하는 옵션이 없다는 것을 확인했습니다. 따라서 tmux 클라이언트를 보고 종료합니다. 이는 세션에서 분리하는 것과 같습니다. tmux 서버가 아직 실행 중입니다. 이것이 tmux를 사용하는 이유 중 하나입니다. 예를 들어 클라이언트가 실행 중이던 터미널이 사라져서 클라이언트가 종료되더라도 세션은 계속 실행됩니다.

3단계: 세션 다시 연결

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

세션을 연결하지 않고 종료하려면 를 사용할 수 있습니다 tmux kill-session. tmux kill-server모든 세션을 종료하라는 명령도 있습니다 .

4단계: 정상적으로 종료

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

답변2

저는 기본 설정으로 Fedora 32를 실행하고 있습니다.

tmux를 열고 ps를 실행하면 두 개의 bash 프로세스가 표시됩니다.

tmux 자체는 bash의 하위 항목이지만 별도의 쉘(세션을 분리할 수 있는 애플리케이션의 전체 요점)을 제공해야 하므로 또 다른 bash 인스턴스를 생성합니다.

tmux 프로세스를 종료하면 터미널이 상위 쉘로 돌아가는 것처럼 보이지만 ps를 다시 실행하면 두 개의 bash 프로세스가 표시됩니다.

어떻게 죽이느냐에 따라 다릅니다.

tmux는 자체 하위 프로세스를 생성한 다음 쉘을 생성합니다.

하위 tmux를 종료하면 하위 bash가 종료되고 bash 프로세스가 남게 됩니다.

상위 tmux를 종료하면 하위 tmux는 그 아래에서 bash 프로세스를 계속 실행합니다. 즉, 두 개의 bash 프로세스를 얻게 됩니다.

답변3

대화를 이해하는 데 있어 환경은 약간 특별합니다 tmux. 주로 그렇게 설계되었기 때문입니다. 일반적으로 프로세스를 종료하면 모든 하위 프로세스가 시스템에 의해 수집(종료)됩니다. (이것은 실제로 일어난 일을 크게 단순화한 것이며 최종 결과는 특정 상황에서 촬영된 경우에만 실제로 정확한 것으로 간주될 수 있습니다.)

tmux, 이 배열은 변경되었습니다. tmux셸을 시작한 다음 해당 세션의 연결을 끊고 로그아웃하고 나중에 다시 로그인하여 동일한 세션에 다시 연결할 수 있도록 설계되었습니다. 그러므로 부모가 죽더라도 자식은 살려준다.

특히 귀하의 경우에는 프로세스, 프로세스로 시작합니다 bash. 이것이 현재 쉘입니다. 을 호출하면 tmux현재 쉘은 이름이 지정된 하위 항목을 시작 tmux하고 tmux자동으로 자체 하위 항목을 시작합니다 bash. 이 두 번째는 명령을 bash실행하는 곳입니다 . ps원래 쉘을 종료하면 tmux실제로 세션이 종료되지 않고 tmux연결만 종료됩니다. 따라서 손자 쉘은 tmux세션에서 계속 실행되고 상위 쉘로 다시 덤프됩니다.

기존 세션에 tmux연결하거나 연결을 끊는 방법과 이를 보다 효율적으로 사용하는 방법을 알아보려면 매뉴얼 페이지를 참조하십시오 .tmuxtmux

관련 정보