파일이 존재하는 경우 시스템 서비스 지연

파일이 존재하는 경우 시스템 서비스 지연

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

관련 정보