시작 프로세스 중에 systemd 서비스 파일을 사용하여 시작되는 데몬 프로세스가 있습니다. 스크립트의 실행 결과에 따라 데몬 프로세스를 시작하고 싶습니다.이 스크립트는 ExecStartPre 옵션 아래의 서비스 파일에 포함되어 있습니다..
기반으로스크립트 실행 결과, 아래에 언급된 대로 서비스를 처리해야 합니다.
- 스크립트가 반환되는 경우0. 서비스를 시작하고 부팅을 계속하세요
- 만약에1반환되며,서비스를 중지하고 계속 시작하지 마십시오.
- 만약에2반환되며,서비스를 시작하지 말고 계속 시작하세요.
내 시나리오가 작동하는지 알고 싶습니다. 그렇다면 이를 달성하는 방법은 무엇입니까?
미리 감사드립니다.
답변1
systemd.service(5)
설명하다:
ExecStartPre=, ExecStartPost= Additional commands that are executed before or after the command in ExecStart=, respectively. Syntax is the same as for ExecStart=, except that multiple command lines are allowed and the commands are executed one after the other, serially. If any of those commands (not prefixed with "-") fail, the rest are not executed and the unit is considered failed. ExecStart= commands are only run after all ExecStartPre= commands that were not prefixed with a "-" exit successfully.
따라서 0이 아닌 종료 코드로 인해 서비스가 실패할 수 있습니다. 이는 목록의 요구 사항 1과 3을 충족합니다. 즉 ExecStartPre=
, 0이 반환되면 서비스가 시작되고 모든 것이 계속 시작됩니다. 0이 반환되지 않으면 ExecStartPre=
서비스는 실패한 것으로 표시되고 다른 모든 것은 계속 시작됩니다. 에 전화하시면 systemctl status
알 수 있습니다 State: degraded
.
조건 2는 약간 혼란 스럽습니다. "시작을 계속하지 마십시오"는 "종료" 또는 "systemctl stop multi-user.target"을 의미합니까? 이 서비스가 시작되지 않으면 시스템을 종료하고 로그인하여 문제를 해결할 수 없습니다(어떤 유형의 복구 모드로 들어가지 않는 한). 어떻게 멈추 multi-user.target
거나 시작해 shutdown.target
도 종료 코드에 따라 쉽게 할 수 있는 일은 아닙니다 ExecStartPre=
. ExecStartPre=
원래 줄을 호출하고 종료 코드를 처리하는 셸 스크립트로 코드를 바꿔야 합니다 .
나는 당신이 비슷한 것을 원할 것이라고 생각합니다 Restart=on-failure
. RestartForceExitStatus=
또는 다음을 사용하여 기본 프로세스의 종료 코드에 따라 서비스를 다시 시작하거나 다시 시작을 방지할 수 있습니다.RestartPreventExitStatus=