생성된 EnvironmentFile이 필요한 여러 시스템 서비스가 있습니다. 이 환경 파일을 생성하는 쉘 스크립트가 있지만 해당 환경 파일이 필요하기 때문에~ 전에Exec... 명령이 실행되면 ExecStartPre=generate_env_file.sh 를 사용할 수 없습니다. 따라서 해당 스크립트를 원샷으로 실행하도록 설정된 다른 서비스(generate_env_file.service)가 있습니다.
[Service]
Type=oneshot
ExecStartPre=/usr/bin/touch /path/to/config.ini
ExecStart=/path/to/generate_env_file.sh
다음과 같은 다른 서비스 파일이 여러 개 있습니다.
[Unit]
Requires=generate_env_file.service
After=generate_env_file.service
두 개 이상의 종속 서비스(generate_env_file.service 필요)가 병렬로 실행되지 않고 generate_env_file.service의 두 병렬 실행이 생성되지 않도록 보장하려면 어떻게 해야 합니까?
RemainAfterExit=true 또는 StartLimitIntervalSec= 및 StartLimitBurst=를 사용하여 일정 기간 동안 한 번에 하나의 복사본만 실행되는지 확인했지만 이 작업을 수행하는 가장 좋은 방법은 잘 모르겠습니다.
답변1
RemainAfterExit=true
가는 길입니다. 이 경우 Systemd는 서비스를 시작하고 Systemd는 이를 시작된 것으로 간주하고 라이브로 간주합니다. 그러나 이는 실행 유스 케이스를 다루지 않습니다 systemctl restart generate_env_file.service
. 이 경우 systemd는 서비스를 다시 실행합니다. 이 문제를 해결하려면 실행 파일 시스템에 마커 파일을 만들고 ExecStartPost=
추가 할 수 있습니다.ConditionPathExists=
파일의 존재를 확인하는 지시어입니다.
답변2
ConditionFirstBoot
또한 흥미로울 수도 있습니다:
부울 인수를 사용합니다. 이 조건은 시스템이 처음으로 부팅되는지 여부에 따라 장치를 조건화하는 데 사용될 수 있습니다. 이는 대략적으로
/etc/
시스템이 부팅을 시작할 때 채워지지 않았음을 의미합니다(자세한 내용은 "첫 번째 부팅 의미" 참조). 머신 ID(5)). 관리자가 시작 단계를 완료한 후 첫 번째 부팅은 완료된 것으로 간주됩니다(이 조건은 false로 평가됨).
/etc/
이 조건은 공장 재설정 후 첫 번째 부팅 시 또는 새 시스템 인스턴스가 처음으로 부팅될 때 채우는 데 사용될 수 있습니다 .견고성을 위해 가 있는 유닛은
ConditionFirstBoot=yes
먼저 스스로 명령을 내리고 가first-boot-complete.target
있는 이 수동 대상을 끌어와야 합니다Wants=
. 이렇게 하면 첫 번째 부팅이 중단된 경우 다음 시스템 시작 시 해당 장치가 다시 실행됩니다.옵션이 커널 명령줄에 지정 되면
systemd.condition-first-boot=
(부울 값 사용) 이 조건 확인 결과를 무시하고/etc/machine-id
존재 확인보다 우선합니다.
답변3
generate_env_file.sh
시작하자마자 잠금 파일이 존재하는지 확인하도록 업데이트하세요 . 잠금 파일이 있으면 즉시 종료하십시오.
잠금 파일이 없으면 즉시 잠금 파일을 터치한 다음 구성 파일을 생성하는 작업을 진행한 다음 잠금 파일을 제거합니다.
다르게 말하면 systemd
구성을 통해 설명하는 상황을 처리할 수 있는 기본 방법이 없다고 생각하므로 잠금 파일을 사용하십시오.
그리고 @shellter가 지적했듯이 Unix 사이트는 systemd
향후 질문에 더 적합한 사이트입니다.