systemd가 예상치 못한 종료를 실패로 처리하도록 합니다.

systemd가 예상치 못한 종료를 실패로 처리하도록 합니다.

시스템 서비스 단위에 타사 실행 파일을 래핑하여 관리합니다. 나는 이 프로그램의 동작을 바꿀 수 없으며, 그 종료 코드도 신뢰하지 않습니다. 종료 코드 0 또는 외부 SIGTERM을 포함하여 systemd로 인해 발생하지 않은 종료를 실패로 처리하여 systemd의 인터페이스를 통해 차이점을 감지할 수 있도록 하고 싶습니다.

현재 내 장치는 다음과 같습니다.

[Unit]
Description=Foo service
Requires=bar.service
After=bar.service

[Service]
ExecStart=/opt/foo/foo -stayresident
KillMode=control-group
Restart=no

서비스 프로세스를 수동으로 종료하면 상태를 확인할 때 "비활성" 상태가 됩니다.systemctl

killall foo && systemctl status foo.service

kill 로 업그레이드하면 -9"실패"가 발생합니다.

killall -9 foo && systemctl status foo.service

이것은 제가 확장하고 싶은 행동입니다.

알아요SuccessExitStatus=서비스 단위 설정을 사용하면 0이 아닌 종료 및 기타 실패 유형을 성공으로 계산할 수 있지만 그 반대는 볼 수 없습니다.

답변1

아마도 필요한 것이 무엇인지 이해하지 못할 수도 있지만 foo명령 뒤에 실패한 명령을 추가하는 것과 같은 간단한 작업을 수행할 수 있습니다. 두 번째 명령은 에 의해 실행되지 않습니다 systemctl stop. 예를 들어 다음 ExecStart으로 바꾸십시오.

ExecStart=/bin/bash -c '/opt/foo/foo -stayresident && exit 7'

7은 상태에서 더 명확하게 볼 수 있도록 선택되었습니다. 신호에 의해 종료 되거나 foo자체적으로 종료되면 쉘 프로세스는 계속 실행되고 종료 코드 7과 시스템 상태가 됩니다.실패. 완료 되면 systemctl stop쉘은 상태와 함께 종료됩니다.비활성(죽음). 자연적으로 방출된 모든 실패 신호는 exit 7원래 명령이 성공한 경우 에만 foo유지되도록 허용됩니다 .

명령 killall foo일치도 방지하려면 다음과 같은 트릭을 사용할 수 있습니다 .bashbash -c '/opt/"f"oo/"f"oo ...'

관련 정보