여러 응용 프로그램을 설치 및 구성하는 데 사용하는 서비스 단위 파일이 있는데 종료 시 시스템을 다시 시작해야 합니다. 이 스크립트를 sysVinit 스크립트에서 centOS 7.1의 systemD로 마이그레이션하려고 하는데 시스템 로그인 화면에서 스크립트가 완료될 때까지 기다릴 수 없습니다.
이전과 이후에 sysinit.target, basic.target, network-online.target을 필수By, WantedBy로 설정하려고 시도했지만 재부팅이 완료될 때까지 로그인 화면을 막는 것은 없습니다.
이 문제를 해결한 사람이 있거나 어떤 서비스가 로그인 화면을 제어하는지 아는 사람이 있나요?
답변1
이를 수행하는 한 가지 방법은 를 사용하는 다른 서비스보다 먼저 서비스가 시작되도록 지정하는 것입니다 Before=
. 이 경우 GUI가 없고 콘솔 로그인을 방지하고 싶으므로 를 사용해야 합니다 [email protected]
. (단, 매개변수화된 서비스이므로 참고하세요. 이 경우 다음 부분은 @
실행할 장치를 나타냅니다 getty
.) 예를 들어:
[Unit]
Description=Run script to set up environment
[email protected] [email protected] [email protected] [email protected] [email protected] [email protected]
[Service]
Type=oneshot
ExecStart=/bin/myscript
getty
이렇게 하면 TTY 1-6에서 부팅하기 전에 스크립트가 실행됩니다.
또는 (빈) 파일을 만들어서 알릴 수 있습니다.[email protected]
아니요시작합니다. 이것의 장점은 getty
1-6뿐만 아니라 모든 인스턴스에 조건을 자동으로 추가한다는 것입니다.
이렇게 하려면 서비스가 시작되기 전에 파일을 만듭니다.
[Unit]
Description=Run script to set up environment
[Service]
Type=oneshot
ExecStartPre=/bin/touch /etc/no-login-console
ExecStart=/bin/myscript
ExecStopPost=/bin/rm /etc/no-login-console
그런 다음 실행하십시오. 그러면 편집기가 열리고 기본 서비스 파일에 효과적으로 추가될 "오버레이" 파일이 생성됩니다. 이렇게 하면 서비스를 사용자 정의할 수 있으면서도 최신 버전의 CentOS 서비스 파일을 계속 사용할 수 있습니다. 열리는 편집기에서 다음을 입력합니다.systemctl edit [email protected]
[Unit]
ConditionPathExists=!/etc/no-login-console
이는 서비스가 /etc/no-login-console
존재하지 않는 경우에만 시작하도록 지시합니다. 편집기를 저장하고 종료합니다. 실행하면 기본 서비스 파일과 재정의가 표시됩니다.systemctl cat [email protected]
편집: CentOS 7.1과 함께 제공되는 버전처럼 보이지만 systemctl edit
사용할 수 없습니다. 대신 (서비스 파일의 경로는 어디에 있습니까?)을 실행하고 위의 텍스트를 파일에 추가하십시오. 그런 다음 실행하고 실행하면 삽입된 파일을 읽었다는 내용이 출력에 표시되어야 합니다.systemctl cat
systemd
sudo vim /lib/systemd/system/[email protected]/condition-path.conf
/lib/systemd/system/[email protected]
systemctl daemon-reload
systemctl status getty@
답변2
display-manager
Ubuntu 16.04에서는 서비스 입니다 . 예를 들어:
[Unit]
Description=Purge home
Before=display-manager.service
[Service]
Type=oneshot
ExecStart=/usr/local/sbin/clean-home.sh
[Install]
WantedBy=display-manager.service