他のコンソール(モニタ)で起動時にtmuxを実行する

他のコンソール(モニタ)で起動時にtmuxを実行する

アロハ!

モニターにヘッドレスサーバーが接続されています。サーバーにグラフィック環境がインストールされておらず、キーボードやマウスが接続されていません。 SSH経由でログインできます。

キーボードを接続してttyにログインし、そこにtmuxセッションを接続しなくても、モニターに表示されているコンソール(tty)にtmuxセッションを表示したいと思います。これにより、対応するtmuxセッションにSSHで接続して、そのモニターに表示される内容(ログ、システム使用量など)をリモートで制御できます。

このモニターにどのコンソールが接続されているか(シェルにログイン、ログインしていないユーザー)、どうすればわかりますか?そして、起動時に(および/またはリモートで/他のコンソールから)自動的にコマンドを実行できますか?

答え1

解決策

これは使用のためのものですsystemd

/etc/systemd/system/tty8tmux.serviceルートとして、次の内容を含むファイルを作成します。

[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 サーバーが自動的に起動します。後で別のtmuxセッションを作成することもできるので、herrcrazi同じサーバーを使用してください。サーバーの環境は実際の親(ここでは)から派生し、クライアントが接続systemdされたときに自動的に更新されないため、期待したものと異なる場合があります。たとえば、参照してください。この回答そしてその中のリンク。

    tmuxサーバーは正式にサービスに属します(制御グループに関する限り)、KillMode=processサービスが停止したときに終了するのを防ぎます。

    上記の理由から、デフォルト以外のソケットを使用することを検討またはUser=somebodyelse教えてくださいtmux(例:-L tty8)。接続時にユーザー(sudo -u somebodyelse tmux a …)を一致させるか、正しいソケットを選択する必要があります。これにより、通常のユーザーは、herrcraziサービスが存在しないかのように他の目的にtmuxを使用できます。

    somebodyelseおそらく根であろう。

  • 代わりに、tmuxセッションを作成し、事前定義されたウィンドウレイアウトで事前定義されたツールセット(たとえば)を実行した後、最終的にを実行ExecStart=/usr/bin/tmux …できます。特定の注意事項:ExecStart=/path/to/shellscriptshellscripthtopwatch 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て再起動してください。 On Demandを使用してメッセージを表示したり、継続表示dmesgを使用したりできますdmesg -wH

  • フロントttyをに手動で変更するには、ttyNを使用しますchvt N。仮想端末でない場合(SSH経由でログインしている場合など)、次のことを行う必要がありますsudo

    sudo chvt 2
    
  • Debian GNU/Linux 12 でテスト済みです。

関連情報