프로그램이 성공적으로 완료된 후 종료되는지, 아니면 오류나 기타 이유로 인해 조기 종료되는지 "트랩"이 알도록 만드는 방법

프로그램이 성공적으로 완료된 후 종료되는지, 아니면 오류나 기타 이유로 인해 조기 종료되는지 "트랩"이 알도록 만드는 방법

질문:

trap제가 작성한 쉘 프로그램이 있지만 정리를 위해 마지막에 포착되는지 또는 일부 명령의 버그로 인해 어떤 방식으로든 정리되는지 확인하는 방법을 모르겠습니다 .

코드는 다음과 같습니다.

################################### Successful exit then this cleanup ###########################################################3

successfulExit()
{
    IFS=$IFS_OLD
    cd "$HOME" || { echo "cd $HOME failed"; exit 155; }
    rm -rf /tmp/svaka || { echo "Failed to remove the install directory!!!!!!!!"; exit 155; }
}
###############################################################################################################################33
####### Catch the program on successful exit and cleanup
trap successfulExit EXIT

질문:

절차가 완료된 후에 trap만 어떻게 할 수 있나요 ?trap EXIT

전체 스크립트는 다음과 같습니다.

debianConfigAwsome.5.3.sh

답변1

EXIT트랩에 진입할 때 $?종료 상태를 포함합니다. 이는 다른 셸에서 이 스크립트를 호출한 경우 찾을 수 있는 것과 동일한 값입니다 $?. 즉, 전달된 인수 exit(0-255 범위로 잘림) 또는 이전 명령의 반환 상태입니다. 종료의 경우 set -e명령의 반환 상태가 암시적으로 트리거됩니다 exit.

$?일반적 으로 동일한 상태로 저장하고 다시 종료해야 합니다 .

cleanup () {
  if [ -n "$1" ]; then
    echo "Aborted by $1"
  elif [ $status -ne 0 ]; then
    echo "Failure (status $status)"
  else
    echo "Success"
  fi
}
trap 'status=$?; cleanup; exit $status' EXIT
trap 'trap - HUP; cleanup SIGHUP; kill -HUP $$' HUP
trap 'trap - INT; cleanup SIGINT; kill -INT $$' INT
trap 'trap - TERM; cleanup SIGTERM; kill -TERM $$' TERM

답변2

허용된 답변에 문제가 있으면 cleanup결국 여러 번 호출될 수 있습니다. 트랩 제거를 정리 기능으로 이동하여 해결되었습니다.

cleanup () {
  local exit_status=$?
  local exit_signal="$1"
  if [ -n "$exit_signal" ]; then
    echo "Aborted by $1"
  elif [ $exit_status -ne 0 ]; then
    echo "Failure (status $exit_status)"
  else
    echo "Success"
  fi
  trap - EXIT HUP INT TERM
  return $exit_status
}

trap cleanup EXIT
trap 'cleanup SIGHUP; kill -HUP $$' HUP
trap 'cleanup SIGINT; kill -INT $$' INT
trap 'cleanup SIGTERM; kill -TERM $$' TERM

관련 정보