Разрешить одну запись за раз в задании incron?

Разрешить одну запись за раз в задании incron?

У меня есть каталог для мониторинга. Когда он обновляется, я запускаю некоторую команду через incron. Когда несколько файлов копируются в этот каталог, incron выполняет несколько команд одновременно. Есть ли способ сделать так, чтобы при запуске одного задания incron второе задание не запускалось?. Я следовалэтот урокдля руководства.

решение1

Нет, incron не имеет встроенной функции блокировки. Если вы хотите запретить одновременный запуск заданий, сделайте это из задания.

Если вы хотите отложить выполнение задания до тех пор, пока не будут выполнены предыдущие, заставьте их заблокироваться. Вы можете использоватьflockкоманда. Примеры есть на странице руководства.

Если вы хотите пропустить задание, если предыдущее не было завершено, вы все равно можете использовать flock, но с тайм-аутом 0. Если вы не можете получить блокировку, выйдите. Обратите внимание, что это подвержено состоянию гонки: может случиться так, что новый файл будет скопирован сразу после того, как задание № 1 закончило перечисление файлов, но до того, как оно успело снять блокировку, и задание № 2 увидит, что блокировка все еще удерживается, и выйдет, также не обработав файл. Нет простого способа решить эту гонку.

решение2

Один из простейших примеров решения: предположим, что 1 означает, что файл заблокирован (предыдущий скрипт уже запущен), а 0 означает, что файл разблокирован (процесс не запущен).

Тогда вот код

    state=`cat /tmp/my_lck`
    if [ "$state" -eq 1 ];then
        echo "Already executing!!!"
        exit
    else
        #Lock the file
        echo 1 > /tmp/nws_lck

       #Put you code here  

 #Unlock    
        echo 0 > /tmp/nws_lck

    fi

Связанный контент