일반화하다:Ssh 연결을 끊을 때 tmux 세션이 종료되는 이유를 알아내려고 합니다.
세부 사항:
Arch Linux 시스템에 tmux를 설치했습니다. tmux 세션을 시작하면 tmux 세션을 분리한 다음 ssh 세션이 활성화된 동안 다시 연결할 수 있습니다. 하지만 ssh 세션을 종료하면 tmux 세션이 종료됩니다.
SSH 세션이 종료된 후에도 tmux 세션이 계속 실행되는 다른 시스템이 있고 새 SSH 연결을 설정한 후 tmux 세션에 연결할 수 있기 때문에 이것이 정상적인 동작이 아니라는 것을 알고 있습니다. 문제의 시스템과 작동하는 시스템이 구성이 매우 유사해서 무엇을 확인해야 할지 잘 모르겠습니다.
저는 tmux 버전 1.9a를 실행하고 있습니다. 문제가 있는 시스템(루트 액세스 권한이 있음)의 Linux 커널 버전은 3.17.4-1이고, 작업 시스템의 커널 버전은 3.16.4-1-ARCH(시스템에 대한 루트 액세스 권한이 없음)입니다. 커널 버전이 문제의 원인인 것으로 의심되지만, 제가 알아차린 차이점일 뿐입니다.
비슷한 문제를 본 사람이 있고 가능한 해결책을 아는 사람이 있는지 물어보고 싶다고 생각했습니다.
문제를 일으키는 구체적인 단계는 다음과 같습니다.
- SSH를 통해 머신으로
tmux
tmux를 시작하려면 실행하세요 .ctrl-B D
분리(이 시점에서 다시 연결할 수 있음)tmux attach
- SSH 세션을 닫습니다. (이 시점에서 tmux 세션이 종료되었습니다. 다른 터미널에서 루트로 로그인했을 때 이를 관찰할 수 있었습니다.)
- ssh를 다시 연결하고 실행하면
tmux attach
메시지가 표시되고 return이no sessions
실행됩니다 . 서비스가 실행되고 있지 않기 때문에 이는 의미가 있습니다. 나에게 이해가 되지 않는 것은 SSH 세션 연결을 끊을 때 4단계에서 종료되는 이유입니다.tmux ls
failed to connect to server: Connection refused
추적 데이터:
의견 중 하나에 대한 응답으로 strace를 사용하여 tmux 서버 프로세스에서 수행된 시스템 호출을 확인했습니다. ssh 세션을 종료하면(입력 exit
또는 사용을 통해 ctrl-d
) tmux 프로세스가 종료되는 것처럼 보입니다 . 이것은 strace 출력의 마지막 부분에 대한 스니펫입니다.
poll([{fd=4, events=POLLIN}, {fd=11, events=POLLIN}, {fd=6, events=POLLIN}], 3, 424) = ? ERESTART_RESTARTBLOCK (Interrupted by signal)
--- SIGTERM {si_signo=SIGTERM, si_code=SI_USER, si_pid=1, si_uid=0} ---
sendto(3, "\17", 1, 0, NULL, 0) = 1
+++ killed by SIGKILL +++
나는 이것을 tmux가 잘 작동하는 다른 시스템과 비교했는데, 그 시스템에서는 종료 후에도 tmux 프로세스가 계속 실행됩니다. 따라서 근본 원인은 SSH 세션을 닫을 때 tmux 프로세스가 종료되는 것 같습니다. 이유를 찾으려면 이 문제를 해결하는 데 시간이 좀 걸리겠지만 strace 제안이 도움이 되므로 질문을 업데이트해야겠다고 생각했습니다.
답변1
이론
일부 init 시스템(systemd 포함)은 서비스에 속한 모든 프로세스를 종료하는 기능을 제공합니다. 서비스는 일반적으로 동일한 작업을 수행할 수 있는 더 많은 프로세스를 생성하기 위해 분기되는 프로세스를 시작합니다. 이러한 모든 프로세스는 일반적으로 서비스의 일부로 간주됩니다. systemd에서는 다음 명령을 사용하여 수행됩니다.cgroup.
systemd에서는 기본적으로 서비스가 중지되면 해당 서비스에 속한 모든 프로세스가 종료됩니다. SSH 서버는 분명히 서비스의 일부입니다. 서버에 연결하면 일반적으로 SSH 서버가 분기되고 새 프로세스가 SSH 세션을 처리합니다. SSH 세션 프로세스 또는 해당 하위 프로세스에서 분기하여 사용자 프로세스를 포함한 다른 서버 측 프로세스를 시작할 수 있습니다.화면또는멀티플렉서.
킬 모드 및 소켓 활성화
기본 동작은 지시문을 사용하여 변경할 수 있습니다 KillMode
. 내가 아는 한, 업스트림 프로젝트에는 .service
파일이 포함되어 있지 않으므로 이러한 파일은 릴리스마다 다릅니다. 일반적으로 시스템에서 SSH를 활성화하는 방법에는 두 가지가 있습니다. 하나는 ssh.service
네트워크를 수신하는 장기 실행 SSH 데몬을 유지하는 고전적인 것입니다 . 다른 하나는 ssh.socket
순차적으로 시작 되고 [email protected]
하나의 SSH 세션만 실행하는 소켓 활성화를 통한 것입니다.
해결책
세션이 끝날 때 프로세스가 종료되면 소켓 활성화를 사용 중일 수 있으며 systemd가 SSH 세션 프로세스 종료를 감지하면 systemd에 의해 프로세스가 종료됩니다. 이 경우 두 가지 해결책이 있습니다. 하나는 ssh.service
대신 를 사용하여 소켓 활성화를 사용하지 않는 것 입니다 ssh.socket
. 다른 하나는 설정 섹션 KillMode=process
에 있습니다 .Service
[email protected]
이 설정은 SSH 세션 프로세스 종료를 방지하거나 KillMode=process
클래식에 유용할 수도 있습니다 .ssh.service
화면또는멀티플렉서서버가 중지되거나 다시 시작될 때 처리됩니다.
미래의 메모
이 답변은 분명히 어느 정도 인기를 얻었습니다. OP에서는 작동했지만 다음과 같은 이유로 인해 향후 누군가에게는 작동하지 않을 수 있습니다.시스템 로그인 개발 또는 구성. 이 답변에 설명된 것과 다른 동작이 발생하는 경우 로그인 세션 설명서를 확인하세요.
답변2
Ubuntu 16.04(kde 네온)의 tmux 및 screen에서도 동일한 문제가 발생했습니다. SSH 세션 연결이 끊어지면 screen/tmux가 종료됩니다.
간단히 말해서 systemd는 기본 설정을 killuserprocess=yes로 변경했기 때문에 생성된 모든 프로세스는 ssh 세션을 떠난 후 종료됩니다.
이 명령을 사용하여 몇 시간 동안 시도한 후 쉽게 수정하여 screen/tmux를 실행하세요.
화면용
systemd-run --scope --user screen
Tmux의 경우
systemd-run --scope --user tmux
더 쉽게 별칭을 만들 수 있습니다.
alias tmux= "systemd-run --scope --user tmux"
답변3
SSH 소켓을 활성화하기 위해 systemd를 사용하고 있습니까?
그렇다면, 있습니다알려진 문제. systemd 지지자들에 따르면 이것은 실제로 기능입니다. 세션이 종료되면 systemd는 세션에 의해 생성된 모든 프로세스를 종료합니다. (이것이 유용하다고 볼 수 있지만 GNU screen
또는tmux
아니요물론 사용자가 백그라운드 프로세스를 실행하는 대부분의 다른 상황에서는 이를 원하지 않습니다. )
만일이 경우라면,sshd.socket
다음에서 전환해 보세요 .sshd.service
.
답변4
다음이 작동하는 것을 발견했습니다 https://pastebin.com/2cifCXGk
(이 참조에서 복사한 답변).
/etc/systemd/system/ 파일 생성[이메일 보호됨]콘텐츠:
[Unit]
Description=Start tmux in detached session
Documentation=man:tmux(1)
[Service]
Type=forking
User=%I
ExecStart=/usr/bin/tmux new-session -s %u -d
ExecStop=/usr/bin/tmux kill-session -t %u
[Install]
WantedBy=multi-user.target
그런 다음 각 사용자에 대해 서비스를 활성화합니다.
sudo systemctl enable tmux@${USER}.service
sudo systemctl start tmux@${USER}.service
sudo systemctl daemon-reload
또는 이 파일을 systemd/User 디렉터리( 제외 User=%I
)에 배치할 수 있습니다(예: ) ~/.config/systemd/user/tmux.service
. 이렇게 하면 systemd 사용자 인스턴스의 자동 시작을 활성화하지 않는 한 로그인할 때 tmux 서비스가 시작됩니다.