"control-c"를 감지하거나 bash 스크립트에서 실패하는 코드

"control-c"를 감지하거나 bash 스크립트에서 실패하는 코드

긴 프로세스를 자동화하기 위해 bash 스크립트를 작성했습니다. 좋은 결과.

그러나 ssh 연결 끊김으로 인해 사용자가 control-c를 누르거나 다시 실행해야 하는 경우 ps -ef|grep myprogram을 실행하면 이전 실행의 나머지 부분이 여전히 실행되고 있음을 발견했습니다.

문제는 사용자에게 회전하는 진행률 표시줄을 표시할 수 있도록 각 단계의 배경을 설정하는 이 코드에 있다고 생각합니다.

<snippet begin>
function progress {
 SPIN='-\|/'
 # Run the base 64 code in the background
 echo $THECOMMAND | base64 -d|bash &
 pid=$! # Process Id of the previous running command
 i=0
 while kill -0 $pid 2>/dev/null
  do
   i=$(( (i+1) %4 ))
   # Print the spinning icon so the user knows the command is running
   printf "\r$COMMAND:${SPIN:$i:1}"
   sleep .2
  done
 printf "\r"
}
<snippet end>

질문: 오류를 감지하거나 control-c를 사용하고 백그라운드 프로세스를 종료하려면 스크립트에 어떤 코드를 추가할 수 있나요?

추가 정보: 래퍼에서 스크립트를 실행하고 스크린 세션에서 실행하고 있습니다.

myprogram.sh $1 > >(tee -a /var/tmp/myprogram_install$DATE.log) 2> >(tee -a /var/tmp/myprogram_install$DATE.log >&

답변1

한 가지 방법은 다음과 같습니다.

quit=n
trap 'quit=y' INT

progress() {
 SPIN='-\|/'
 # Run the base 64 code in the background
 echo $THECOMMAND | base64 -d|bash &
 pid=$! # Process Id of the previous running command
 i=0
 while kill -0 $pid 2>/dev/null
  do
   if [ x"$quit" = xy ]; then
    kill $pid
    break
   fi
   i=$(( (i+1) %4 ))
   # Print the spinning icon so the user knows the command is running
   printf "\r$COMMAND:${SPIN:$i:1}"
   sleep .2
  done
 printf "\r"
}

관련 정보