Резюме : я пытаюсь выяснить, почему мой сеанс tmux умирает, когда я отключаюсь от ssh
Детали :
Я установил tmux в систему Arch Linux. Когда я запускаю сеанс tmux, я могу отсоединиться от него, а затем снова подключиться, пока сеанс ssh активен. Но если я закончу свою сессию ssh, то сессия tmux будет уничтожена.
Я знаю, что это не нормальное поведение, потому что у меня есть другая система, в которой сеанс tmux продолжает работать, даже если сеанс ssh завершен, и я могу подключиться к сеансу tmux после установления нового соединения ssh. Система, в которой возникла проблема, и система, которая работает правильно, имеют очень похожие конфигурации, поэтому я не уверен, что проверять.
Я использую tmux версии 1.9a. Система, в которой возникла проблема (для которой у меня есть доступ с правами root), имеет версию ядра Linux 3.17.4-1, а система, которая работает правильно, имеет версию ядра 3.16.4-1-ARCH (у меня нет root на этом система). Я сомневаюсь, что версия ядра является источником проблемы, но я заметил только одно отличие.
Я решил спросить, видел ли кто-нибудь похожую проблему и знает ли ее решение.
Точные шаги, которые приводят к проблеме:
- SSH к машине
- беги
tmux
чтобы запустить tmux ctrl-B D
отсоединить (в этот момент я мог прикрепить сtmux attach
- закрыть сессию ssh (на данный момент сессия tmux прервана, я смог наблюдать это, когда я вошел в систему как root на другом терминале)
- переподключитесь с ssh и запустите,
tmux attach
и я получаю сообщениеno sessions
и запускаюtmux ls
возвратыfailed to connect to server: Connection refused
. Это имеет смысл, потому что подача не работает. Что не имеет смысла для меня, так это то, почему он убивается на шаге 4, когда я отключаюсь от сеанса ssh.
данные страйса:
В ответ на один из комментариев я использовал 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 продолжает выполняться даже после моего выхода. Таким образом, основной причиной является то, что процесс tmux завершается, когда я закрываю сессию ssh. Мне нужно потратить некоторое время на устранение неполадок, чтобы выяснить, почему, но я подумал, что обновлю свой вопрос, так как предложение strace было полезным.
Ответы:
теория
Некоторые системы инициализации, включая systemd, предоставляют возможность уничтожать все процессы, принадлежащие сервису. Служба обычно запускает один процесс, который создает больше процессов путем разветвления, и эти процессы также могут это делать. Все такие процессы обычно считаются частью сервиса. В systemd это делается с помощью cgroups .
В systemd все процессы, принадлежащие сервису, прекращаются, когда сервис останавливается по умолчанию. Сервер SSH, очевидно, является частью службы. Когда вы подключаетесь к серверу, сервер SSH обычно разветвляется, и новый процесс обрабатывает ваш сеанс SSH. При ответвлении от процесса сеанса SSH или его дочерних элементов запускаются другие процессы на стороне сервера, включая ваш экран или tmux .
Killmode и активация сокета
Поведение по умолчанию можно изменить с помощью
KillMode
директивы. В последнем проекте AFAIK нет.service
файлов, поэтому они различаются в зависимости от дистрибутива. Как правило, есть два способа включить SSH в вашей системе. Одним из них является классикаssh.service
, поддерживающая длительное прослушивание SSH-демона в сети. Другой - через активацию через сокет, которая обрабатываетсяssh.socket
запускаемой программой,sshd@.service
которая выполняется только для одного сеанса SSH.Решения
Если ваши процессы будут уничтожены в конце сеанса, возможно, вы используете активацию сокета, и он будет уничтожен systemd, когда он заметит, что процесс сеанса SSH завершился. В этом случае есть два решения. Один из них - избегать использования сокетов, используя
ssh.service
вместоssh.socket
. Другой - установитьKillMode=process
вService
разделеssh@.service
.Этот
KillMode=process
параметр также может быть полезен для классического приложенияssh.service
, так как он предотвращает уничтожение процесса сеанса SSH или процессов экрана или tmux, когда сервер останавливается или перезапускается.Будущие заметки
Этот ответ, по-видимому, приобрел уровень популярности. Хотя он работает для OP, может случиться так, что он не будет работать для кого-то в будущем из -за разработки или конфигурации systemd-logind . Пожалуйста, проверьте документацию по сеансам входа в систему, если вы испытываете поведение, отличное от описания в этом ответе.
источник
init
а неsystemd
. Но в любом случае это немного другое, см. Мой вопрос .Используете ли вы systemd с активацией сокета для SSH?
Если так, то есть известная проблема с этим . Согласно сторонникам systemd, это на самом деле особенность - systemd убивает все процессы, порожденные сеансом, когда сеанс завершается. (Я вижу, что это полезно, но в GNU
screen
, илиtmux
, в случае, вы определенно не хотите этого - и в большинстве других случаев, когда пользователи, конечно, могут запускать фоновые процессы.)Если да, то попробуйте переключиться с
sshd.socket
кsshd.service
.источник
У меня была такая же проблема с tmux и экраном на Ubuntu 16.04 (kde neon). Когда сеанс 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 found
наRed Hat Enterprise Linux Server release 6.8 (Santiago)
.Другое решение этого, которое не требует перехода из
sshd.socket
вsshd.service
, - это запускtmux
сервера в качестве службы systemd [0]. Таким образом,tmux
сервер уже работает, когда вы запускаете SSH на сервер, а не порождаетсяtmux
командой в SSH, поэтому он не будет уничтожен.[0] https://wiki.archlinux.org/index.php/tmux#Autostart_with_systemd
источник
Лучший ответ, который я нашел, IMO, дан в Prevent Logoff from Killing tmux Session :
Это «особенность» существовала в
systemd
ранее, но этиsystemd
разработчиках решили произвести изменения в значениях по умолчанию , чтобы включить параметр для прекращения дочерних процессов при выходе из сеанса.Вы можете восстановить эту настройку в вашем
logind.conf
(/etc/systemd/logind.conf
):источник