Código para detectar "control-c" ou falha em um script bash

1

Eu escrevi um script bash para automatizar um processo muito longo. Isso funciona bem.

No entanto, se o usuário deve controlar-c ou reexecutar devido a uma desconexão ssh, descubro que há um remanescente da execução anterior ainda em execução se eu: ps -ef | grep myprogram.

Acredito que o problema esteja neste snippet de código no qual faço o background de cada etapa para poder mostrar ao usuário uma barra de progresso:

<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>

Pergunta: Qual código posso adicionar ao meu script que detectará uma falha ou control-c e eliminará o processo em segundo plano?

Informação adicional: Eu corro o script de um wrapper e executo isso em uma sessão de tela.

myprogram.sh $1 > >(tee -a /var/tmp/myprogram_install$DATE.log) 2> >(tee -a /var/tmp/myprogram_install$DATE.log >&
    
por Marinaio 02.11.2017 / 16:29

1 resposta

3

Uma maneira de fazer isso:

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"
}
    
por 02.11.2017 / 16:44