데비안 패키지 설치 중 하위 프로세스가 실패하고 설치가 즉시 종료되는 것을 방지하는 방법

데비안 패키지 설치 중 하위 프로세스가 실패하고 설치가 즉시 종료되는 것을 방지하는 방법

나는 Apache Derby를 설치하기 위해 나만의 Debian 패키지를 만들고 있으며 설치의 일부로 구성 스크립트를 실행하여 일부 기본 사용자를 설정하려고 합니다. 그래서 설치과정에서 Apache Derby 웹서버를 구동시킨 후, 해당 클래스의 "ping" 명령어를 이용하여 존재 여부를 테스트해보았습니다 NetworkServerControl.

짧은 시간 내에 서버가 시작되도록 하기 위해 "ping" 명령이 여러 번 실패할 것으로 예상했기 때문에 각 ping 사이에 1초씩 일시 중지하면서 약 10번 정도 루프를 돌렸습니다.

let retry_count=0
echo "Testing for the Derby network server..."
$(which java) -Dderby.system.home=/srv/apache/derby -cp /usr/lib/apache/derby/derbynet.jar org.apache.derby.drda.NetworkServerControl ping -h localhost -p 1527 > /dev/null
until [[ $? -eq 0 ]]; do
    echo "Network server not available."
    let retry_count+=1
    if [[ ${retry_count} -ge 10 ]]; then
        echo "Network server was not available within ${retry_count} seconds. Terminating install." >&2
        exit 1
    fi
    sleep 1
    echo "Testing for the Derby network server..."
    $(which java) -Dderby.system.home=/srv/apache/derby -cp /usr/lib/apache/derby/derbynet.jar org.apache.derby.drda.NetworkServerControl ping -h localhost -p 1527 > /dev/null
done

그러나 첫 번째 ping이 실패하여(1 반환) 전체 설치 프로세스가 실패했다는 사실을 발견했습니다.

In test_server_up function
Sun Sep 15 12:30:27 BST 2019 : Could not connect to Derby Network Server on host localhost, port 1527: Connection refused (Connection refused)
dpkg: error processing package derby-deb (--install):
    installed derby-deb package post-installation script subprocess returned error exit status 1

ping 명령의 결과를 변수에 할당하려고 시도했지만 동일한 오류가 발생했습니다.

하위 프로세스의 결과를 캡처하고 이로 인해 설치가 종료되는 것을 방지할 수 있는 방법이 있습니까?

답변1

나는 이것이 설치 후 스크립트에서 호출되었다고 생각합니다.

데비안 패키징 규칙은 set -e어떤 경우에도 오류와 함께 종료되는 shell post-inst와 같은 스크립트를 사용하는 것입니다.잡히지 않은0이 아닌 종료 코드입니다. 예를 들어 ||, 또는, &&또는 if/ elif, while또는 등을 사용하여 종료 상태를 "캡처"할 수 있습니다 until. 자세한 내용은 man bash(검색 )을 참조하세요 -e.*Exit.

예를 들어

ping_count=0
until ping hostname || [ "$ping_count" -gt 5 ]; do
  sleep 1 # or whatever
  ping_count+=1   # non-posix. won't work with dash.
done

set +e핑(또는 알고 있는 오류 코드를 반환할 수 있는 다른 명령)을 실행하기 전에 이 방법을 시도해 보세요.아니요care) 이후로 돌아갑니다 set -e.

참고: 나는매우 강력히 권장됩니다.그냥 완전히 제거 하세요 set -e. 설치 후 다른 프로그램이 오류 코드를 반환하는 경우 귀하(및 패키지를 설치하는 다른 사람)는 이에 대해 알고 싶고 dpkg설치가 실패했는지 알고 싶습니다 .

관련 정보