한 번만 실행해야 하는 systemd oneshot 요구 사항

한 번만 실행해야 하는 systemd oneshot 요구 사항

생성된 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향후 질문에 더 적합한 사이트입니다.

관련 정보