ConditionPathExists=
파일이 존재하지만(예: 파일이 존재하는 경우 서비스가 실패하는 대신 ) 장치에서 아무것도 찾지 못한 경우 서비스 시작을 지연하고 싶습니다.문서
시스템화는 기술적으로 가능합니까? 어떻게?
답변1
내가 아는 한, ConditionPathExists=
장치를 "실패" 상태로 두지 않습니다. ConditionPathExists=
이 단위를 건너뛰세요.
유닛 파일에는 여러 Condition…= 및 Assert…= 설정이 포함될 수도 있습니다. 장치가 시작되기 전에 systemd는 지정된 조건이 참인지 확인합니다. 그렇지 않은 경우 장치 시작은 (대부분 자동으로) 건너뛰게 됩니다. 오류 조건으로 인해 장치가 "실패" 상태로 전환되지 않습니다.
ExecStartPre=
파일 존재에 따라 장치 시작을 지연시키는 방법 중 하나는 then Restart=on-failure
및 test files 을 사용하는 것입니다 RestartSec=
. 이렇게 하면 장치가 실패 상태가 되지만 성공할 때까지 계속 재시도합니다. 예를 들어:
[Service]
# Should cause failure if file exists
ExecStartPre=/usr/bin/test ! -f afile
ExecStart=mycommand
# Restart on failure. Keep trying to create backup.
RestartSec=10m
Restart=on-failure
답변2
한 유닛만 사용하세요
TimeoutStartSec=infinity
유닛 파일을 넣고 ExecStart=
다음 스크립트를 사용하여 구성하십시오.
#! /bin/bash
TIMEOUT=1000
test -f /path/to/testfile && sleep "$TIMEOUT"
exec /path/to/service/binary plus arguments
이것은 (유용한 방법으로) 수행될 수 없습니다 . ExecStartPre=
다음을 참조하십시오.man systemd.service
ExecStartPre=는 장기 실행 프로세스를 시작하는 데 사용할 수 없습니다. ExecStartPre=로 호출된 프로세스에 의해 생성된 모든 프로세스는 다음 서비스 프로세스가 실행되기 전에 종료됩니다.
보조 장치 사용
systemd를 사용하여 이 작업을 "혼자" 수행하려면 도우미 유닛을 만들 수 있습니다 check_and_wait.target
. 이것은 항목을 가져옵니다
# check_and_wait.target
[Unit]
TimeoutStartSec=infinity
ConditionPathExists=/path/to/testfile
ExecStart=/usr/bin/sleep 1000
RemainAfterExit=yes
기본 장치는 다음 항목을 가져옵니다.
Wants=check_and_wait.target
After=check_and_wait.target
답변3
[Service]
ExecStartPre=bash -c "while [ -f /path/to/file ]; do sleep 1; done"
ExecStart=your_command