BASH Блокировка скрипта от запуска если он уже работает (синглетон)

Материал из Выращивание растений.
Перейти к: навигация, поиск


Не спрашивайте, как это работает, но я нашел и протестировал вариант приведенный ниже. Если хотите убедиться сами, добавьте после этого кода строку sleep 5 (останов на 5 сек) и запустите два скрипта из разных консолей.

Начинаю скрипт так, а дальше - мой код.

#!/bin/bash

# If the file is already locked by another process, the operation fails.
# This function defines a lock on a file as having 
# a file descriptor open to the file.
# This function uses FD 9 to open a lock on the file.  
# To release the lock, close FD 9:
# exec 9>&-
#
mutex() {
    local file=$1 pid pids

    exec 9>>"$file"
    { pids=$(fuser -f "$file"); } 2>&- 9>&-
    for pid in $pids; do
        [[ $pid = $$ ]] && continue

        exec 9>&-
        return 1 # Locked by a pid.
    done
}

mutex /var/run/runMeWeekly.lock || { echo "Already running." >&2; exit 1; }