ExecCondition은 서비스 시작을 방해하지 않습니다.

ExecCondition은 서비스 시작을 방해하지 않습니다.

ExecCondition종료를 사용할 때 status=1/FAILURE데몬 시작을 방해하지 않는 서비스 파일이 있습니다 .

나는 문서에 따르면 데몬이 시작되는 것뿐만 아니라 다른 모든 ExecStartPre명령이 실행되는 것도 막아야 한다고 믿습니다.

ExecCondition= 명령이 종료 코드 1~254(포함)로 종료되면 나머지 명령은 건너뛰고 장치는 실패로 표시되지 않습니다.

systemd.service 문서

매번 뻔하게 실패하는 조건을 세웠어요.ExecCondition=-sh -c 'exit(1)'

여기에 서비스 파일이 있습니다(무고한 사람들을 보호하기 위해 이름이 변경되었습니다).

[Unit]
Description=Application
Wants=x-ray.service yankee.service zulu.service
Requires=alpha.service bravo.service
After=x-ray.service charlie.service bravo.service

[Service]
ExecCondition=-sh -c 'exit(1)'
ExecStartPre=-sh -c 'prestartShellScript.sh'
ExecStart=/opt/app/app argument1 argument2
WatchdogSec=10
Restart=always
RestartSec=10
WorkingDirectory=/opt/app
TimeoutSec=10

[Install]
WantedBy=multi-user.target

그러나 서비스를 시작하면 systemctl status app다음을 사용하여 애플리케이션이 실행 중이고 다른 프로세스도 실행 중임을 알 수 있습니다.

     Active: active (running) since Fri 2020-02-07 18:06:57 UTC; 6s ago
    Process: 33783 ExecCondition=/bin/sh -c exit(1) (code=exited, status=1/FAILURE)
    Process: 33796 ExecStartPre=/bin/sh -c prestartShellScript.sh (code=exited, status=0/SUCCESS)
   Main PID: 33827 (app)
      Tasks: 19 (limit: 4177)
     Memory: 101.5M
     CGroup: /system.slice/app.service
             └─33827 /opt/app/app argument1 argument2

저도 바꿨 ExecCondition는데 ExecStartPre똑같은 증상이 나오네요.

답변1

명령 앞에는 -모든 Exec*= 매개변수에서 허용되는 공통 플래그인 가 붙으며 특히 "종료 코드를 무시하고 명령을 항상 성공한 것으로 처리"한다는 의미입니다. -명령이 실패를 보고할 때 systemd가 장치를 실패하게 하려는 경우에는 사용하지 마십시오.

관련 정보