다음 유형의 시스템 서비스 파일이 있습니다.
[Unit]
Description=Mount some special file systems
After=local-fs.target
Before=syslog.service
[Service]
Type=oneshot
ExecStart=/root/some-complicated-mounts.sh
ExecStop=/root/some-complicated-umounts.sh
RemainAfterExit=yes
[Install]
WantedBy=multi-user.target
이 스크립트는 /root/some-complicated-mounts.sh
일부 파일 시스템을 마운트합니다.
해당 문을 추가할 때까지 서비스가 제대로 작동하지 않았습니다 RemainAfterExit=yes
. 이 문이 없으면 로그에 따르면 스크립트가 성공적으로 실행되었더라도 스크립트로 완료된 설치가 사라진 것처럼 보입니다.
RemainAfterExit=yes
해당 선언이 필요한 이유와 시스템 문서에서 이 동작이 설명된 위치를 알고 싶습니다 .
답변1
이 단일 서비스는 이것이 없으면 작동하지 않습니다. RemainAfterExit=yes
왜냐하면 systemd는 스크립트가 완료되자마자 장치가 비활성화될 것이라고 생각하고 some-complicated-mounts.sh
, 이 시점에서 명령 실행을 포함하여 장치를 중지한 ExecStop=
다음 다음을 실행하여 파일 시스템 마운트 해제를 진행하기 때문입니다. some-complicated-umounts.sh
스크립트.
를 사용하면 RemainAfterExit=yes
명령이 완료된 후 장치가 시작된 것으로 간주되어 문제가 해결됩니다 ExecStart=
.활동적으로 지내다. 따라서 명령은 ExecStop=
장치가 명시적으로 중지된 경우( systemctl stop
명령 사용) 또는 일반적인 종료 프로세스의 일부로(모든 장치가 중지된 경우)에만 실행됩니다.
문서화와 관련하여 systemd 문서에는 실제로 이러한 상황에 대한 예가 있습니다."예 3. 중지 가능한 일회성 서비스"systemd.service(5) 매뉴얼 페이지. 사용 사례 예시는 다음과 같습니다.
일회성 서비스와 유사하게 프로그램을 실행하여 무언가를 설정한 다음 다른 프로그램을 실행하여 종료해야 하는 장치가 있지만 "시작"된 것으로 간주되면 프로세스가 활성 상태로 유지되지 않는 장치가 있습니다. [...]
이를 위해 systemd는 설정을 알고
RemainAfterExit=yes
있으며 실행 작업이 성공적으로 종료되면 systemd는 장치가 활성 상태인 것으로 간주합니다.
또한실시예 2, 아니오입니다 ExecStop=
.
(안타깝게도 문서에는RemainAfterExit=
그 자체로는 너무 간결하고 실제로 세부 사항을 다루지 않습니다. 이 옵션에 대한 문서를 개선할 기회가 있을 수 있습니다. )