システム起動時に接続されたサーバーモニターを閉じる

システム起動時に接続されたサーバーモニターを閉じる

編集済み

私の古いMacbookをLinuxサーバーのインストールに置き換えました。Ubuntu Server 22.04 TTL。システムにSSHでのみ接続してモニターを消したいです。

次のコマンドは、物理サーバーで実行してモニターを閉じるときにのみ機能します(SSHセッションでは機能しません)。

setterm -blank force

これにより、問題なくSSHを介してシステムを引き続き使用できます。ただし、もちろん、システムを再起動すると、モニターは再びオンになり、物理サーバーのセッションを介してのみモニターをオフにできます。

次のサービススクリプトを作成し、次の場所に保存しました/etc/systemd/system/monitor-off.service

[Unit]
Description=Turn off monitor on startup

[Service]
Type=simple
ExecStart=/usr/bin/setterm -blank force

[Install]
WantedBy=multi-user.target

次に、を使って有効にしますsystemctl enable monitor-off。しかし、再起動しても動作しません。

systemctl is-enabled monitor-off戻りを実行しますenabled。ただし、実行すると、systemctl status monitor-off次のような結果が表示されます。

× monitor-off.service - Turn off monitor on startup
     Loaded: loaded (/etc/systemd/system/monitor-off.service; enabled; vendor preset: enabled)
     Active: failed (Result: exit-code) since Fri 2023-01-20 22:40:58 UTC; 11min ago
    Process: 791 ExecStart=/usr/bin/setterm -blank force (code=exited, status=1/FAILURE)
   Main PID: 791 (code=exited, status=1/FAILURE)
        CPU: 2ms

Jan 20 22:40:58 server systemd[1]: Started Turn off monitor on startup.
Jan 20 22:40:58 server setterm[791]: setterm: $TERM is not defined.
Jan 20 22:40:58 server systemd[1]: monitor-off.service: Main process exited, code=exited, status=1/FAILURE
Jan 20 22:40:58 server systemd[1]: monitor-off.service: Failed with result 'exit-code'.

$ TERMが定義されていないと言ったので、これを(物理マシンでセッションを実行するとLinuxは$ TERMです)ExecStart=/usr/bin/setterm -blank forceに置き換えましたが、それでも運はありません。ExecStart=/usr/bin/setterm -blank force --term linux

サービス構成ファイルの[サービス]セクションを次のように編集しました。

[Service]
Type=oneshot
Environment="TERM=linux"
StandardOutput=tty
TTYPath=/dev/tty0
ExecStart=/usr/bin/setterm -blank force 

サービスを再起動してコンピュータを再起動した後、起動時に何も起こらずにモニタが開いたままです。 systemctl status は以下を提供します。

Loaded: loaded (/etc/systemd/system/monitor-off.service; enabled; vendor preset: enabled)
Active: inactive (dead) since Sat 2023-01-21 12:44:43 CST; 44s ago
Process: 790 ExecStart=/usr/bin/setterm -blank force (code=exited, status=0/SUCCESS)
Main PID: 790 (code=exited, status=0/SUCCESS)
CPU: 3ms

Jan 21 12:44:43 server systemd[1]: Starting Turn off monitor on startup...
Jan 21 12:44:43 server systemd[1]: monitor-off.service: Deactivated successfully.
Jan 21 12:44:43 server systemd[1]: Finished Turn off monitor on startup.

また、SSHではなく仮想コンソールを介して手動でサービスを開始しようとしたsystemctl start monitor-off.service場合setterm: cannot force blank: Inapproproate ioctl for device。 SSHを介してこのコマンドを実行すると、エラーは返されませんが、まだモニターはオフになりません。

答え1

マニュアルページの「説明」セクションの最初の文は次setterm(1)のとおりです。

setterm指定された端末関数を呼び出す文字列を標準出力に書き込みます。

仮想コンソールにログインすると、標準出力は/dev/tty[0-9]*使用している仮想コンソール番号と一致するデバイスになり、コマンドは期待どおりに機能します。また、環境変数は、定義にLinux仮想コンソールの「モニターオフ」文字列を含む別の値TERMに設定するか、他の値を持つ必要があります。linux

SSH経由でログインすると、標準出力はSSH接続に関連付けられたPTYデバイスになり、SSHクライアントの端末エミュレーション表示を効果的にオフにしようとします。

systemdサービスでコマンドを実行すると、setterm標準出力はTTY / PTYデバイスに送信されず、systemdのログ(デフォルト)に送信されます。ログに特殊文字列を出力することは、ローカルモニタを閉じるなどの特別な効果を持ってはいけません。

[Service]次のセクションに次の行を追加してみてくださいmonitor-off.service

Environment="TERM=linux"
StandardOutput=tty
TTYPath=/dev/tty0

/dev/tty0実際の数に関係なく、現在アクティブな仮想コンソールを表します。)

また、「display off」ターミナル制御文字列を出力した後、サービスが実行を継続しないようにして、サービスが正常に実行されても、systemdがサービスを「Type=oneshotfailed」としてマークするようType=simpleにします。settermType=simple

関連情報