Один экземпляр длительного процесса с таймаутом - PullRequest
0 голосов
/ 05 марта 2020

В сценарии 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 на самом деле не так долго, , а затем продолжите, как планировалось, если оно не завершено.

Я бы предпочел второй вариант, но не уверен, как это можно сделать.

...