Это не гонка - это устойчивость к неудачам. В тех случаях, когда сценарий умирает до того, как сможет удалить файл, необходимо выполнить очистку вручную.
Обычный способ попытаться автоматизировать эту очистку - это прочитать PID из любого существующего файла, проверить, существует ли еще процесс, и, по существу, игнорировать его существование, если он не существует. К сожалению, без атомарной операции сравнения и установки это не тривиально, чтобы сделать правильно, так как она вводит новую гонку между чтением PID и кем-то еще, пытающимся игнорировать его существование.
Проверьте этот вопрос , чтобы узнать больше идей о блокировке, используя только файловую систему.
Мой совет - либо сохранить файл блокировки во временной файловой системе (/var/run
обычно представляет собой tmpfs, позволяющий pid-файлам безопасно исчезнуть при перезагрузке), чтобы все исправилось после перезагрузки, либо чтобы скрипт поднял руки и попросить ручного вмешательства. Обработка каждого случая отказа надежно увеличивает сложность и, следовательно, вероятно, увеличивает вероятность отказа, чем обращение к человеку за помощью.
И сложность не только сегодня, но и для времени жизни кода. Это может быть правильно, когда вы закончите, но не нарушит ли это следующий человек?