В сценарии bash я вызываю особо долго работающий процесс (запрос к базе данных) и записываю его вывод в файл.
Может быть несколько экземпляров самого сценария, запущенных одновременно, с другими параметрами, но всегда должен быть только один экземпляр долгосрочного запроса. Я обрабатываю это с flock
примерно так:
(
# wait 5 seconds to see if the currently running process finishes
flock -w 5 100 || exit 75
long_running_process > "$cachefile"
) 100>~/script_dir/.lockfile
Сценарий должен дать результат как можно быстрее. Большую часть времени он будет просто читать из файла кэша. Но если этот файл еще не существует, устарел или не содержит данных, относящихся к аргументу, передаваемому в сценарий, то он достигает указанного выше раздела и вызывает длительный процесс. Пока работает long_running_process
, сценарий все еще пытается получить соответствующие данные из файла и не заставляет того, кто его вызывает, ждать, пока long_running_process
не завершится sh. Сценарий завершится sh вскоре после этого вызова, и я не хочу, чтобы long_running_process
заканчивал его.
Я вижу два способа сделать это:
- Фон
long_running_process
немедленно. Работает ли это правильно с flock
, как он используется здесь? - Подождите некоторое время, если
long_running_process
на самом деле не так долго, , а затем продолжите, как планировалось, если оно не завершено.
Я бы предпочел второй вариант, но не уверен, как это можно сделать.