Я думаю, вам нужно использовать команду lockfile. См. использование файлов блокировки в сценариях оболочки (BASH) или http://www.davidpashley.com/articles/writing-robust-shell-scripts.html.
Вторая статья использует «файл ручной блокировки» и показывает, как поймать завершение скрипта и снять блокировку; хотя использование lockfile -l <timeout seconds>
, вероятно, будет достаточно хорошей альтернативой для большинства случаев.
Пример использования без таймаута:
lockfile script.lock
<do some stuff>
rm -f script.lock
Гарантирует, что любой второй скрипт, запущенный во время этого скрипта, будет бесконечно долго ждать удаления файла.
Если мы знаем, что скрипт не должен запускаться более X секунд, а script.lock
все еще там, это, вероятно, означает, что предыдущий экземпляр скрипта был убит до того, как его удалили script.lock
. В этом случае мы можем указать lockfile
принудительно создать блокировку после тайм-аута (X = 10 ниже):
lockfile -l 10 /tmp/mylockfile
<do some stuff>
rm -f /tmp/mylockfile
Поскольку lockfile
может создавать несколько файлов блокировки, существует параметр, определяющий, сколько времени нужно ждать, прежде чем пытаться получить следующий необходимый файл (-<sleep before retry, seconds>
и -r <number of retries>
). Существует также параметр -s <suspend seconds>
для времени ожидания, когда блокировка была снята силой (который дополняет время ожидания, используемое для ожидания перед принудительным снятием блокировки).