부팅 중에 원격에서 일부 주요 파일을 가져오도록 하는 Ubuntu 18+용 클라우드 동기화 스크립트를 작성 중입니다. Plymouth 시작 화면 이후, 그러나 사용자 로그인 화면(그래픽 환경 유무에 관계없이) 이전에 실행하고 싶습니다.
이 응용 프로그램의 경우 콘솔에 메시지를 인쇄하고 로그인하기 전에 사용자의 키 누름을 기다려야 하기 때문에 스크립트가 종료될 때까지 로그인을 지연해야 하지만 시스템 서비스 장치를 제대로 가져올 수 없는 것 같습니다. .
아래 예제는 비그래픽 환경(systemd default.target = multi-user.target)에서는 작동하지만 그래픽 환경(default.target =graphical.target)에서는 작동하지 않습니다. 내가 무엇을 놓치고 있나요?
[Unit]
Requires=network-online.target
After=network-online.target plymouth-quit-wait.service
[email protected]
[Service]
Type=oneshot
StandardInput=tty
StandardOutput=tty
StandardError=tty
TTYPath=/dev/tty1
ExecStart=/home/user/myscript.sh
[Install]
WantedBy=multi-user.target
답변1
올바른 순서는 after plymouth-quit.service
이지만 before 인 것 같습니다 display-manager.service
. 이는 이전에 시작된 마지막 장치입니다 plymouth-quit-wait.service
. 즉, 활성화된 경우 디스플레이 관리자를 실행합니다.앞으로스플래시 화면이 사라집니다.
따라서 우선적인 디스플레이 관리자 서비스를 추가하지 않고 Plymouth 문제를 극복하려면 해결 방법은 스크립트에서 새 서비스를 실행 tty2
하고 가상 터미널을 전환하는 것입니다.tty2
[Unit]
Requires=network-online.target
After=network-online.target plymouth-quit.service
Before=display-manager.service
[Service]
Type=oneshot
StandardInput=tty
StandardOutput=tty
StandardError=tty
TTYPath=/dev/tty2
TTYReset=yes
TTYVHangup=yes
ExecStart=/path/to/script.sh
[Install]
WantedBy=multi-user.target
#!/bin/bash
# Change the virtual terminal to tty2
# so user can interact with the script and see its output
chvt 2
# do stuff
echo "Hello, world!"
# Change back to tty1
# so user is shown console login,
# or sent to wherever the display manager decides
chvt 1
이것은 작동하지만 스크립트에 추가 논리를 추가하거나 래퍼를 작성하지 않으면 그다지 깨끗하지 않습니다. tty1
예를 들어 데스크톱이 아닌 다른 곳에서 실행하는 경우 에서 실행 중이 tty7
거나 tty2
이미 사용 중입니다.
내 스크립트는 시작 시에만 실행되어야 하므로 괜찮을 것입니다. 그러나 전체 시간 동안 모든 것을 계속 실행할 수 있는 순수한 시스템 솔루션이 있거나 tty1
이에 대해 듣고 싶습니다.default.target
multi-users.target
graphical.target