arquivo de bloqueio não removido quando o trap está dentro de um “if”

1

Eu coloquei minha armadilha dentro de um if , executei o script, e após essa segunda execução, ele avisa que o arquivo de bloqueio está travado (ok). Mas quando eu kill -9 o PID em execução, o arquivo de bloqueio não é removido.

Quando eu mover o trap antes do if (o que você pode ver agora comentado abaixo):

  1. então, quando eu mato -9 PID, o arquivo de bloqueio é excluído (ok)
  2. mas quando executo execuções adicionais nos scripts, apenas o primeiro avisa porque após essa primeira execução adicional, o arquivo de bloqueio é removido por trap na EXIT!

Como obter a armadilha dentro de if para remover o arquivo de bloqueio em kill -9 do script?

lockfile=/tmp/localfile
#trap 'rm -f "$lockfile"; exit $?' INT TERM EXIT KILL
if ( set -o noclobber; echo "$$" > "$lockfile") 2> /dev/null;
then
    trap 'rm -f "$lockfile"; exit $?' INT TERM EXIT KILL
    while true
    do
        ls -ld ${lockfile}
        sleep 1
    done
   rm -f "$lockfile"
   trap - INT TERM EXIT
else
   echo "Failed to acquire lockfile: $lockfile."
   echo "Held by $(cat $lockfile)"
fi
    
por DonJ 22.03.2018 / 11:57

1 resposta

0

kill -KILL (ou kill -9 ) mata o processo sem poder limpá-lo. O sinal SIGKILL é não-interceptável por design.

Use um kill simples (envia TERM por padrão).

Veja também: Por que não devo usar 'kill - 9 '/ SIGKILL

    
por 22.03.2018 / 12:01

Tags