이전 동료가 작성한 init.d 스크립트를 보고 있는데 지금은 올바르게 실행되지 않습니다. centos-6에서 실행됩니다.
몇 가지 실험 끝에 문제의 원인을 찾았습니다. 그가 작성한 스크립트는 오류를 보고하기 전에 kill -TERM 명령이 citon을 실행할 때까지 최대 30초를 기다립니다. 이를 위해 그는 다음 명령을 실행합니다.
kill -0 $pid
종료된 프로그램이 종료되었는지 테스트합니다.
Kill -0 명령으로 인해 오류가 발생합니다.
/etc/init.d/celerybeat line 211: kill (<pid>) - No such process
회선이 실패한 직후에 존재합니다.
이것이 내가 set -e에서 기대하는 것이지만 스크립트는 set -e를 실행하지 않습니다. 실제로, kill -0 명령이 설정되면 실패한다는 메모와 함께 해당 행을 주석 처리했기 때문에 그는 이 명령이 설정되는 것을 원하지 않는다는 것을 잘 알고 있습니다.
대신 서비스를 통해 실행하거나 /etc/init.d 디렉터리에서 직접 스크립트를 실행하면 이런 일이 발생합니다.
그렇다면 ..set -e가 설정된 것처럼 스크립트가 실행되는 이유는 무엇입니까? 더 중요한 것은 어떻게 이런 식으로 실행되는 것을 방지하거나 예외를 발생시키지 않고 pid가 실행되고 있는지 확인하기 위해 줄을 다시 작성하는 것입니다.
답변1
set +e
오류 종료 를 사용 또는 비활성화 set +o errexit
하거나 오류 종료가 적용되지 않도록 조건에서 명령을 실행할 수 있습니다. 가장 간단한 것은 다음과 같습니다.
somecmd ... || true
kill -0
그러나 이로 인해 반환 값이 파괴되고 설정 외에는 많은 작업을 수행하지 않으므로 필요할 수 있습니다 . 아마도 다음과 같을 겁니다:
if kill -0 "$pid" 2>/dev/null ; then
echo it lives
fi
"이유"에 관해서는 CentOS 6이 Upstart를 실행한다고 생각합니다.일부 우분투 문서set -e
Upstart가 활성화된 스크립트를 실행하고 있음 을 나타내는 것 같습니다 .