편집됨
내 오래된 Macbook을 Linux 서버 설치로 바꾸었습니다.우분투 서버 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] 섹션을 다음과 같이 편집했습니다.
[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=oneshot
failed "로 표시하도록 Type=simple
하려고 합니다 .setterm
Type=simple