ExecCondition
종료를 사용할 때 status=1/FAILURE
데몬 시작을 방해하지 않는 서비스 파일이 있습니다 .
나는 문서에 따르면 데몬이 시작되는 것뿐만 아니라 다른 모든 ExecStartPre
명령이 실행되는 것도 막아야 한다고 믿습니다.
ExecCondition= 명령이 종료 코드 1~254(포함)로 종료되면 나머지 명령은 건너뛰고 장치는 실패로 표시되지 않습니다.
매번 뻔하게 실패하는 조건을 세웠어요.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가 장치를 실패하게 하려는 경우에는 사용하지 마십시오.