ssh에서 연결을 끊을 때 tmux 세션이 종료 됨


23

요약 : ssh에서 연결을 끊을 때 tmux 세션이 왜 종료되는지 알아 내려고합니다.

세부 사항 :

아치 리눅스 시스템에 tmux가 설치되어 있습니다. tmux 세션을 시작할 때 ssh 세션이 활성화 된 상태에서 tmux 세션을 분리 한 후 다시 연결할 수 있습니다. 그러나 ssh 세션을 종료하면 tmux 세션이 종료됩니다.

ssh 세션이 종료 된 경우에도 tmux 세션이 계속 실행되고 새 ssh 연결을 설정 한 후 tmux 세션에 연결할 수있는 다른 시스템이 있기 때문에 이것이 정상적인 동작이 아님을 알고 있습니다. 문제가있는 시스템과 올바르게 작동하는 시스템은 매우 유사한 구성을 가지고 있으므로 확인할 것이 확실하지 않습니다.

tmux 버전 1.9a를 실행 중입니다. 문제가있는 시스템 (루트 액세스 권한이있는 시스템)에는 Linux 커널 버전 3.17.4-1이 있으며 올바르게 작동하는 시스템에는 커널 버전 3.16.4-1-ARCH가 있습니다 (루트가 없습니다) 체계). 커널 버전이 문제의 원인이라고 의심합니다.

다른 사람이 비슷한 문제를 보았고 가능한 해결책을 알고 있는지 묻고 싶다고 생각했습니다.

문제를 일으키는 정확한 단계는 다음과 같습니다.

  1. 기계에 ssh
  2. tmuxtmux를 시작하기 위해 실행
  3. ctrl-B D 분리 (이 시점에서 다시 연결할 수 있습니다 tmux attach
  4. ssh 세션을 닫습니다 (이 시점에서 tmux 세션이 종료되었습니다. 다른 터미널에서 루트로 로그인했을 때 이것을 볼 수있었습니다)
  5. ssh와 다시 연결하고 실행 tmux attach하면 메시지가 표시 no sessions되고 running을 tmux ls반환합니다 failed to connect to server: Connection refused. 서브가 실행되고 있지 않기 때문에 이치에 맞습니다. 이해가되지 않는 것은 ssh 세션에서 연결을 끊을 때 4 단계에서 종료되는 이유입니다.

strace 데이터 :

의견 중 하나에 응답하여 strace를 사용하여 tmux 서버 프로세스가 호출하는 시스템을 확인했습니다. tmux 프로세스가 종료되는 ssh 세션을 종료 exit하거나 (입력 또는 사용하여 ctrl-d) 것처럼 보입니다. 다음은 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 제안이 유용했기 때문에 질문을 업데이트 할 것이라고 생각했습니다.


확실히, 단계별로 설명하십시오 : ssh, tmux 세션을 시작하고 세션에서 분리하고 shh를 닫는 것으로 가정하십시오. 즉, 세션이 더 이상 실행되지 않습니까?
Olivier Dulac

@OlivierDulac 네 가정은 정확합니다. 또한 이러한 세부 정보를 포함하도록 질문을 편집했습니다.
Gabriel Southern

ssh 세션을 어떻게 닫습니까? sshd의 pid에 strace를 부착하고 sshd의 pid에 strace를 부착하여 ssh 연결을 닫을 때 무언가를 수신하는지 확인할 수 있습니다 (매우 상세하고 파일로 리디렉션)
Olivier Dulac

@OlivierDulac 제안에 감사드립니다. strace의 정보로 질문을 업데이트했습니다. ssh 세션을 종료하면 tmux 서버 프로세스가 종료되는 것처럼 보입니다. 나는 이것이 일어날 것이라고 생각하지 않기 때문에 왜 그런 일이 일어나고 있는지 알아야합니다.
Gabriel Southern

상세 로깅이 활성화 된 상태에서 tmux를 시작하고 연결을 끊을 때 로그에 어떤 것이 인쇄되는지 확인하십시오. 또한 tmux 안팎에서 원격 시스템의 TERM은 무엇입니까?
jasonwryan

답변:


16

이론

systemd를 포함한 일부 init 시스템은 서비스에 속하는 모든 프로세스를 종료하는 기능을 제공합니다. 서비스는 일반적으로 분기하여 더 많은 프로세스를 작성하는 단일 프로세스를 시작하며 해당 프로세스도이를 수행 할 수 있습니다. 이러한 모든 프로세스는 일반적으로 서비스의 일부로 간주됩니다. systemd에서 이것은 cgroups를 사용하여 수행됩니다 .

systemd에서 서비스가 기본적으로 중지되면 서비스에 속하는 모든 프로세스가 종료됩니다. SSH 서버는 분명히 서비스의 일부입니다. 서버에 연결하면 일반적으로 SSH 서버가 분기되고 새 프로세스가 SSH 세션을 처리합니다. SSH 세션 프로세스 또는 해당 하위에서 포크하여 screen 또는 tmux를 포함한 다른 서버 측 프로세스가 시작 됩니다.

킬 모드 및 소켓 활성화

기본 동작은 KillMode지시문을 사용하여 변경할 수 있습니다 . 업스트림 프로젝트는 AFAIK에 .service파일을 포함하지 않으므로 파일은 배포에 따라 다릅니다. 일반적으로 시스템에서 SSH를 활성화하는 두 가지 방법이 있습니다. 하나는 ssh.service네트워크에서 오래 실행되는 SSH 데몬을 유지하는 고전 입니다. 처리 소켓 활성화를 통해 다른 생기는 경우는 ssh.socket턴 시작에 sshd@.service단 하나의 SSH 세션을 위해 실행됩니다.

솔루션

세션이 끝날 때 프로세스가 종료되면 소켓 활성화를 사용 중일 수 있으며 SSH 세션 프로세스가 종료 된 것을 알면 systemd에 의해 종료됩니다. 이 경우 두 가지 솔루션이 있습니다. 하나는 ssh.service대신을 사용하여 소켓 활성화를 사용 하지 않는 것입니다 ssh.socket. 다른 섹션은 KillMode=processService섹션 에서 설정 합니다 ssh@.service.

KillMode=process설정은 고전에 유용 할 수 ssh.service는 SSH 세션 처리하거나 죽이는 피한다로, 화면 또는 TMUX 서버가 중지 또는 다시 시작됩니다 프로세스를.

향후 노트

이 답변은 분명히 어느 정도 인기를 얻었습니다. OP에서 작동 했지만 시스템 로그인 개발 또는 구성 으로 인해 향후 누군가에게는 작동하지 않을 수 있습니다. 이 답변의 설명과 다른 동작이 발생하면 로그인 한 세션에 대한 설명서를 확인하십시오.


downvoter 또는 트롤링에서 특정 피드백?
Pavel Šimerda

3
자세한 답변 감사합니다. sshd.service로 전환하면 문제가 해결되었습니다.
Gabriel Southern

init대신을 사용하는 시스템에서이 문제가 발생합니다 systemd. 그러나 어쨌든 약간 다릅니다 . 내 질문을 참조하십시오 .
gerrit

5

SSH에 대해 소켓 활성화와 함께 systemd를 사용합니까?

그렇다면 알려진 문제가있는 것입니다 . 시스템 제안자에 따르면, 이것은 실제로 기능입니다. systemd는 세션이 종료 될 때 세션이 생성 한 모든 프로세스를 종료합니다. (I 유용되는 것을 볼 수 있지만, GNU의 수 screen, 또는 tmux, 당신은 확실히, 케이스를 하지 않는 것을 ☺도 사용자는 물론, 백그라운드 프로세스를 실행할 수 있습니다 대부분의 경우합니다.)

그렇다면 에서 sshd.socket로 전환 해보십시오sshd.service .


1
사용자가 로그 아웃 한 후 실행중인 프로세스를 실행할 수있는 경우 일반적으로 SSH 로그인에이 기능을 사용하고 싶지 않다고 말하고 싶습니다. 이는 화면 또는 tmux에만 국한된 것이 아니라 서버 측의 백그라운드 프로세스가있는 SSH에 국한된 것입니다.
Pavel Šimerda

2
@ PavelŠimerda 네, 암시 적이라고 생각했지만 게시물을 더 명확하게 편집했습니다.
mirabilos

3

Ubuntu 16.04 (kde neon)의 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"


-bash: systemd-run: command not foundRed Hat Enterprise Linux Server release 6.8 (Santiago).
gerrit

내가 뿌리를 얻지 못했을 때 작동합니까?
gerrit

1
Ubuntu 18.04 LTS에서는 원하지 않는 tmux / screen killing 동작이 발생하지 않으며 16.04 만 발생했습니다.
세스

2

에서 이동이 필요로하지 않는 또 다른 해결책 sshd.socket으로는 sshd.service, 시작하는 tmuxsystemd 서비스 [0]으로 서버. 이런 식으로 tmuxSSH의 tmux명령 으로 스폰되지 않고 서버에 SSH로 연결할 때 서버가 이미 실행 중이므로 종료 되지 않습니다.

[0] https://wiki.archlinux.org/index.php/tmux#Autostart_with_systemd


내가 뿌리를 얻지 못했을 때 작동합니까?
gerrit

네, 유효한 해결책입니다. 그러나 SSH 세션을 통해 SSH 서비스를 다시 시작하여 문제를 해결하려고합니다. :)
Pavel Šimerda 2016

여러분, OpenRC를 사용하는 경우 , ArchWiki
Megver83에서

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.