Предотвращение автоматического завершения сеанса tmux, созданного systemd, по Ctrl + C - PullRequest
0 голосов
/ 09 ноября 2018

Уже несколько дней я успешно запускаю новый Minecraft Bedrock Edition на своем домашнем сервере Ubuntu 18.04 LTS. Поскольку он должен быть доступен 24/7 и автоматически запускаться после загрузки, я создал службу systemd для отдельного сеанса tmux :

tmux.minecraftserver.service

[Unit]
Description=tmux minecraft_server detached

[Service]
Type=forking
WorkingDirectory=/home/mine/minecraftserver
ExecStart=/usr/bin/tmux new -s minecraftserver -d "LD_LIBRARY_PATH=. /home/mine/minecraftser$
User=mine

[Install]
WantedBy=multi-user.target

Все работает, как и ожидалось, но есть одна маленькая вещь, которая продолжает меня беспокоить:

Как я могу помешать tmux завершить весь сеанс, когда я нажимаю Ctrl+C? Я просто хочу завершить процесс сервера Minecraft сам вместо всего сеанса tmux . При запуске сервера из командной строки в сеансе tmux, созданном вручную, работает (сеанс остается активным), но не в том случае, если сеанс был вызван systemd .

.

Ответы [ 2 ]

0 голосов
/ 12 ноября 2018

Я могу решить эту проблему, используя systemd's ExecStartPost и tmux send-keys следующим образом:

[Unit]
Description=tmux minecraft_server detached

[Service]
Type=forking
WorkingDirectory=/home/mine/minecraftserver
ExecStart=/usr/bin/tmux new -d -s minecraftserver
ExecStartPost=/usr/bin/tmux send-keys -t minecraftserver "cd /home/mine/minecraftserver/" Enter "LD_LIBRARY_PATH=. ./bedrock_server" Enter

User=mine

[Install]
WantedBy=multi-user.target
0 голосов
/ 10 ноября 2018

При запуске сервера из командной строки в сеансе tmux, созданного вручную, работает (сеанс остается активным), но не при запуске сеанса systemd . * 1006. *

Разница между этими ситуациями на самом деле не связана с systemd. В одном случае вы запускаете сервер из оболочки в сеансе tmux, а когда сервер завершает работу, управление возвращается в оболочку. В другом случае вы запускаете сервер непосредственно в сеансе tmux, и когда он завершается, нет оболочки, к которой можно вернуться, поэтому сеанс tmux также умирает.

tmux имеет возможность поддерживать сеанс после того, как процесс внутри него умирает (ищите remain-on-exit на странице руководства), но это, вероятно, не то, что вы хотите: вы хотите иметь возможность вернуться к интерактивной оболочке, чтобы перезагрузите сервер, выясните, почему он умер, или выполните, например, задачи по обслуживанию. Так что, вероятно, лучше изменить вашу команду на это:

'LD_LIBRARY_PATH=. /home/mine/minecraftserver/…; exec bash'

То есть сначала запустите сервер, а затем, после его завершения, замените процесс (оболочку, которая tmux неявно порождает для запуска команды, но которая затем завершится) другой интерактивной оболочкой. (О некоторых других способах получения интерактивной оболочки после выхода из команды см., Например, этот вопрос - но обратите внимание, что синтаксис <(echo commands), предложенный в верхнем ответе, недоступен в файлах системных модулей. )

...