在系统启动时关闭连接的服务器监视器

在系统启动时关闭连接的服务器监视器

已编辑

我已经将我的旧 Macbook 变成了 Linux 服务器安装Ubuntu 服务器 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 未定义,所以我替换ExecStart=/usr/bin/setterm -blank forceExecStart=/usr/bin/setterm -blank force --term linux(linux 是我在物理机上运行会话时的 $TERM。),但仍然没有运气。

我将服务配置文件的 [Service] 部分编辑为如下所示:

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

重新启动服务并重新启动计算机后,启动时没有任何反应,监视器仍然打开。 systemctl 状态给了我这个:

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]*您正在使用的虚拟控制台编号匹配的设备,并且该命令将按预期工作。此外,环境变量TERM需要设置为linux或其定义包含 Linux 虚拟控制台的“monitor off”字符串的其他值。

当您通过 SSH 登录时,标准输出将是与 SSH 连接关联的 PTY 设备,并且您最终将有效地尝试关闭 SSH 客户端的终端模拟的显示。

当您将命令作为 systemd 服务运行时setterm,其标准输出不会发送到任何 TTY/PTY 设备,而是发送到 systemd 的日志中(默认情况下)。将特殊字符串输出到日志中当然不应该产生像关闭本地监视器那样的特殊效果。

尝试将这些行添加到[Service]您的以下部分monitor-off.service

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

/dev/tty0指当前活动的虚拟控制台,无论其实际数量是多少。)

您还希望该服务而Type=oneshot不是Type=simple.因为setterm在输出“关闭显示”终端控制字符串后不会保持运行状态,因此Type=simple即使已成功执行,也会导致 systemd 将服务标记为“失败”。

相关内容