No caminho é definido o trap em erros e deixe sh
abortar o script em caso de erros ( set -e
). Por exemplo
$ cat test.sh
set -e
trap "echo foo" ERR
if [ $# == 1 ]; then
exit 0
fi
false
$ bash test.sh
foo
$ bash test.sh 1
$
(onde $#
é o número de argumentos)
No seu script, você só precisa certificar-se de que executa o comando trap quando o script é executado com êxito (ou seja, nenhum travamento acontece, por exemplo, no final do fluxo de programa normal).
set -e
significa que cada status de saída desigual 0
encerra a execução do script. Semelhante a isso, com set -u
cada uso (provavelmente acidental) de uma variável indefinida termina a execução.
Assim, transferindo essa ideia para o caso de uso original, uma solução poderia ser assim:
$ cat test.sh
set -e
trap "rm -f run_script.lck" ERR
if [ -f run_script.lck ]; then
echo Script $0 is already running
exit 1
fi
#
# do all the work ...
#
# no error until now
rm -f run_script.lck