Как предотвратить от CronJob выполненный процесс дважды?

У меня есть Cron Job сценарии, который работает каждые 4 минуты. В редких случаях сценарий не закончен в течение 4 минут. Это вызывает проблемы.

Как я могу выполнить проверку, которые, если там предыдущий сценарий не закончен затем, пропускают текущее выполнение

Ожидаемое поведение:

10:00 : Script A starts
10:04 : Script A2 starts - it finds that script A was not finish so this script aborts. Simply finish without doing nothing.
10:06 : Script A finish 
10:08 : Script A3 starts - no other scripts running so it continue

Уведомление: A, A2, A3 являются тем же сценарием (только в различные времена)! Это не должно рассматривать другие сценарии, которые могли бы работать также

4
задан 16 May 2017 в 14:43

1 ответ

Существует два основных подхода:

  1. заставьте сценарий выйти, если он обнаруживает другой экземпляр себя выполнение. Просто добавьте эти строки к началу Вашего сценария:

    if [ $(pgrep -c "${0##*/}") -gt 1 ]; then
         echo "Another instance of the script is running. Aborting."
         exit
    fi
    

    $0 название сценария, и ${0##*/} название сценария со всем до последнего / удаленный (так, /path/to/script.sh становится script.sh). Это означает, что, если у Вас есть другой, несвязанный сценарий с тем же выполнением имени, он будет все еще обнаружен. с другой стороны, это также означает, что это будет работать даже при вызове сценария от символьной ссылки. Какой, который Вы предпочитаете, зависит от Вашего варианта использования.

  2. Используйте файл блокировки и выйдите из сценария, если файл существует:

    #!/bin/bash
    
    if [ -e "/tmp/i.am.running" ]; then
        echo "Another instance of the script is running. Aborting."
        exit
    fi
    else
        touch  "/tmp/i.am.running"
    fi
    
    ## The rest of the script goes here
    
    rm "/tmp/i.am.running"
    
6
ответ дан 1 December 2019 в 09:20

Другие вопросы по тегам:

Похожие вопросы: