У меня есть скрипт, выполняемый как служба с функцией do_firewall
, которая запускается каждые 10 секунд.Эта же функция может быть вызвана, когда процесс сценария получает сигнал SIGUSR1.Является ли эта функция критической областью?
Код выглядит следующим образом:
SIGUSR1=10
trap do_firewall SIGUSR1
do_firewall() {
# manage some iptables commands implemented in an idempotent
# mechanism
# is this a critical region?
}
###################################################################
# Main block
###################################################################
while true; do
# If there is no do_firewall process running
do_firewall
sleep 10
done
Теперь я уже убедился, что когда SIGUSR1 перехватывает сигнал, он управляется тем же процессом, выполняющим основной цикл.,Я сомневаюсь, что может случиться так, что пока я нахожусь в середине функции do_firewall
и получаю SIGUSR1, в ней могут возникнуть условия гонки.
Я думаю, что нет, но я не уверен на 100%.
В случае, если я должен добавить что-то подобное в функцию do_firewall
:
do_firewall() {
(
flock -e 200
# critical region
) 200>/var/run/lockfile
}
Кроме того, 200 безопасный дескриптор файла для использования?