在不同的控制台(监视器)上启动时运行 tmux

在不同的控制台(监视器)上启动时运行 tmux

阿罗哈!

我有一个连接到显示器的无头服务器。服务器未安装图形环境,也未连接任何键盘或鼠标。我可以通过 SSH 登录。

我想让它在显示器上显示的控制台(tty)上显示 tmux 会话,而无需插入键盘、登录 tty 并在那里附加 tmux 会话。这样,我可以简单地通过 SSH 连接到该 tmux 会话,并远程控制该监视器上显示的内容(日志、系统使用情况等)。

我如何知道哪个控制台连接到该监视器(登录外壳,没有用户登录),以及如何在启动时自动在其上运行命令(和/或远程/从另一个控制台)?

答案1

解决方案

这是针对使用systemd.

/etc/systemd/system/tty8tmux.service以 root 身份创建一个包含以下内容的文件:

[Unit]
Description=Tmux session in tty8

[Service]
Type=idle
User=herrcrazi
KillMode=process
ExecStart=/usr/bin/tmux new-session -s tty8 -A -f read-only
ExecStartPost=+/usr/bin/chvt 8
ExecStop=/usr/bin/tmux kill-session -t tty8
ExecStopPost=+/usr/bin/chvt 1
TTYPath=/dev/tty8
StandardInput=tty
StandardOutput=tty
StandardError=tty

[Install]
WantedBy=multi-user.target

通知systemd某些事情发生了变化:

sudo systemctl daemon-reload

启用该服务:

sudo systemctl enable tty8tmux.service

启动服务:

sudo systemctl start tty8tmux.service

启动服务将创建一个tty8以指定用户命名的tmux 会话herrcrazi,并将 tmux 客户端附加到它。客户端将在虚拟终端 tty8 中运行。如果 tmux 会话已经存在,客户端将附加到它而不重新创建。无论如何,tty8 将成为前台虚拟终端。

停止服务将破坏名为 的 tmux 会话tty8并将显示切换到 tty1。如果您更喜欢仅终止 tmux 客户端(而不是会话),那么只需省略(删除或注释掉)指定ExecStop=.由于KillMode=process只有主进程(即 tmux 客户端)才会被杀死。

该服务将随系统自动启动。

通过 SSH 连接后herrcrazi,通过调用以下命令附加到 tmux 会话:

tmux attach-session -t tty8 -f ignore-size

提示、注释

  • 该服务将随系统启动,并且可能还没有可供用户使用的 tmux 服务器herrcrazi。 tmux 服务器将自动启动。由于herrcrazi您稍后可能想要创建其他 tmux 会话,因此它们将使用同一服务器。服务器的环境将来自其实际的父级(此处来自systemd),并且在客户端连接时不会自动更新,因此它可能是也可能不是您所期望的。参见例如这个答案以及其中的链接。

    tmux 服务器将正式属于该服务(就控制组而言),尽管KillMode=process在服务停止时可以避免其被终止。

    由于上述原因,请考虑User=somebodyelse或告诉tmux使用非默认套接字(例如,使用-L tty8)。连接时,您需要匹配用户 ( sudo -u somebodyelse tmux a …) 或选择正确的插座。这样,您的普通用户herrcrazi将能够将 tmux 用于其他目的,就好像该服务不存在一样。

    somebodyelse可能是根。

  • 相反,ExecStart=/usr/bin/tmux …您可以ExecStart=/path/to/shellscript,因此创建一个tmux 会话并在预定义的窗格布局中shellscript运行预定义的工具集(例如htop,, ),并最终运行。具体注意事项:watch sensorswatch df -hexectmux attach-session -t tty8

    • 您需要设置所有内容而不附加并最后附加(例子)。
    • 在附加之前,tmux 可能会假设错误的尺寸(请参阅这个问题)。像tmux new-session -d -s tty8 -A -f read-only -x - -y -脚本中一样使用,然后设置其余的。
    • 最后你需要exec tmux a …,所以 tmux 客户端取代脚本和systemd看不到进程(脚本)已经死亡。
    • 这个答案学习什么该做、什么不该做。
    • 有一种方法可以预先创建精确的窗格布局并按需使用它,请参阅这个答案
  • 内核消息可能会出现在 tty8 中,尤其是在关闭时。在正常操作期间,它们会干扰我们的 tmux 客户端显示的内容;并且由于在 tty8 内运行的客户端根据自己的需要配置终端,因此此类消息看起来不合适。考虑告诉内核仅使用 tty1。您可以通过添加console=tty1内核参数来完成此操作。如果这是唯一的参数,那么相关行/etc/default/grub应如下所示:

    GRUB_CMDLINE_LINUX="console=tty1"
    

    (或者GRUB_CMDLINE_LINUX_DEFAULT)。

    保存文件后调用sudo update-grub并重新启动。请注意,您仍然可以使用 点播查看消息dmesg或使用 继续观看dmesg -wH

  • 如果您想手动将前台 tty 更改为ttyN,请使用chvt N。如果不在虚拟终端中(例如,如果通过 SSH 登录),您需要sudo

    sudo chvt 2
    
  • 在 Debian GNU/Linux 12 上测试。

相关内容