Systemd는 스크립트를 시작할 수 없습니까?


8

시작할 때 BASH 스크립트를 실행하고 싶습니다. 내 시스템이 systemd로 실행 중이므로 필요한 정보라고 생각되는 .service 파일을 만들었습니다.

[Unit]
Description=My Script
After=network.target

[Service]
ExecStart=/home/myscript.sh

[Install]
WantedBy=multi-user.target

나는 systemctl enable을 사용하여 재부팅 된 '등록'했습니다. 부팅 할 때 스크립트가 실행된다고 들었지만 스크립트에 쓴 내용에 따라 ECHO가 화면에 표시하거나 파일에 내용을 쓰지 않은 메시지를 볼 수 없었습니다. 또한 시작 예정인 응용 프로그램을 시작하지 않습니다.

Systemctl 상태는 스크립트가 성공적으로 실행 및 종료되었음을 알려줍니다. 여전히 스크립트는 효과가 없습니다. 쉘에서 스크립트를 실행하면 완벽하게 작동합니다.

내 문제가 무엇인지 아는 사람이 있습니까?


3
분명히, 스크립트가 다른 것을 시작하면 "Type = forking"이 필요합니다. 이전 설정을 어지럽히 지 않은 것에 대해 약간 바보 같은 느낌이 들었습니다.
TokyoMEWS

1
그것을 해결하기 위해 +1. 솔루션을 답변으로 게시하고 동일한 문제를 가진 다른 사람들을 돕기 위해 수락하십시오.
terdon

1
@TokyoMEWS : 더 정확하게 말하면, 스크립트가 다른 것을 시작 하고 자식이 실행되는 동안 종료 되면 "Type = forking"이 필요합니다.
grawity

답변:


7

TokyoMEWS가 스스로 발견 한 것 외에도 ...

분명히 스크립트가 다른 것을 시작하면 "Type = forking"이 필요합니다.

(완전히 정확하지는 않습니다- 자식이 실행되는 동안Type=forking 스크립트가 종료 된 경우에만 필요합니다 )

... 다른 가능한 문제는 다음과 같습니다.

  1. "화면에 표시"란 스크립트가 단순히 stdout에 무언가를 쓰는 것을 의미한다고 생각합니다. 부팅하는 동안 화면으로 이동 하지 않습니다. 오히려 서비스 stdout의 모든 내용이 저널 (또는 시스템 버전에 따라 syslog)로 전송됩니다.

  2. 당신이 경우 않았다 실제로 화면으로 쓰기 (예를 들어, 사용을 시도 echo Hi >/dev/tty1), 다음이 때 스크립트의 출력이 사라질 가능성이 높다이다 agetty를가 로그인 프롬프트를 표시하기 전에 화면을 지 웁니다. (이를 피하려면 장치를 주문해야합니다 After=getty@tty1.service).

  3. 파일에 무언가를 쓰려면 파일 시스템을 읽기 / 쓰기로 마운트해야합니다. 이를 위해 필요할 After=local-fs.target 수 있습니다 . 그렇지 않으면 장치가 너무 일찍 시작될 수 있습니다. 그러나 이것은 특정 OS 구성에 따라 다릅니다.


1

스크립트가 ExecStop 절도 정의하는 경우 ExecStart 이후에 ExecStop이 자동으로 호출 되지 않도록 " RemainAfterExit = yes"를 설정해야합니다 . 그러면 ExecStart 명령 을 실행 한 후 서비스가 " active " 상태가 됩니다.

[Service]
ExecStart=/home/myscript.sh start
ExecStop=/home/myscript.sh stop
RemainAfterExit=yes
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.