【问题标题】:Preventing tmux session created by systemd from automatically terminating on Ctrl+C防止 systemd 创建的 tmux 会话在 Ctrl+C 时自动终止
【发布时间】:2019-04-13 10:58:46
【问题描述】:

几天后,我在我的 Ubuntu 18.04 LTS 家庭服务器上成功运行了新的 Minecraft 基岩版 专用服务器。因为它应该 24/7 可用并在启动后自动启动,所以我为分离的 tmux 会话创建了一个 systemd 服务:

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

一切都按预期进行,但有一件小事一直困扰着我:

当我按下 Ctrl+C 时,如何防止 tmux 终止它的整个会话? 我只想终止 Minecraft 服务器进程本身,而不是整个 tmux 会话。在手动创建的 tmux 会话中从命令行启动服务器时,这确实工作(会话保持活动状态)但在 systemd 启动会话时不起作用。

【问题讨论】:

  • 为什么要在 tmux 中运行它?我想不出任何有意义的理由。如果您真正的问题是“如何通过 systemd 启动 Minecraft 服务器?”,您应该问这个问题。上面你的问题可能有答案,可能有一定的学术价值,但其实这只是个坏主意。

标签: linux systemd tmux sigterm


【解决方案1】:

我可以像这样使用 systemd 的 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

【讨论】:

    【解决方案2】:

    当在手动创建的 tmux 会话中从命令行启动服务器时,这确实工作(会话保持活动状态),但在 systemd 启动会话时不起作用。

    这些情况的区别其实和systemd无关。在一种情况下,您从 tmux 会话中的 shell 启动服务器,当服务器终止时,控制权返回给 shell。在另一种情况下,您直接在 tmux 会话中启动服务器,当它终止时没有 shell 可以返回,因此 tmux 会话也终止了。

    tmux 有一个选项可以在其中的进程死亡后保持会话处于活动状态(在手册页中查找 remain-on-exit),但这可能不是您想要的:您希望能够返回到交互式 shell,以例如,重新启动服务器、调查其死机的原因或执行维护任务。所以最好把你的命令改成这样:

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

    也就是说,首先运行服务器,然后在它终止后,用另一个交互式 shell 替换进程(tmux 隐式生成的运行命令的 shell,但随后会退出)。 (有关在命令退出后获取交互式 shell 的其他一些方法,请参阅例如 this question - 但请注意,在最佳答案中建议的 <(echo commands) 语法在 systemd 单元文件中不可用。)

    【讨论】:

    • 这也是一个不错的解决方案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-08-21
    • 1970-01-01
    • 2016-01-23
    • 2022-01-16
    • 2013-12-01
    • 1970-01-01
    相关资源
    最近更新 更多