Просто имейте в виду, что выбранный ответ - bashism
, что означает решение как
trap "{ rm -f $LOCKFILE }" EXIT
будет работать только в bash (он не будет перехватывать Ctrl + c, если shell dash
или classic sh
), но если вы хотите совместимости, вам все равно нужно перечислить все сигналы, которые вы хотите перехватить.
Также имейте в виду, что когда скрипт выходит из ловушки для сигнала «0» (он же EXIT) всегда выполняется, что приводит к двойному выполнению команды trap
.
Это причина не складывать все сигналы в одну строку, если есть сигнал EXIT.
Чтобы лучше понять это, посмотрите на следующий скрипт, который будет работать в разных системах без изменений:
#!/bin/sh
on_exit() {
echo 'Cleaning up...(remove tmp files, etc)'
}
on_preExit() {
echo
echo 'Exiting...' # Runs just before actual exit,
# shell will execute EXIT(0) after finishing this function
# that we hook also in on_exit function
exit 2
}
trap on_exit EXIT # EXIT = 0
trap on_preExit HUP INT QUIT TERM STOP PWR # 1 2 3 15 30
sleep 3 # some actual code...
exit
Это решение даст вам больше контроля, поскольку вы можете запускать часть своего кода при появлении фактического сигнала непосредственно перед окончательным выходом (функция preExit
), а при необходимости вы можете запускать некоторый код при фактическом сигнале EXIT (финальная стадия выход)