긴 프로세스를 자동화하기 위해 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"
}