Как предотвратить процесс 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

3 ответа

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

вывести скрипт, если он обнаруживает другой экземпляр сам. Просто добавьте эти строки в начало вашего скрипта:
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). Это означает, что если у вас есть другой, несвязанный скрипт с тем же именем, он все равно будет обнаружен. с другой стороны, это также означает, что он будет работать, даже если вы вызываете скрипт из символической ссылки. Какой из них вы предпочитаете, зависит от вашего варианта использования. Используйте файл блокировки и выйдите из сценария, если файл существует:
#!/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"
5
ответ дан 22 May 2018 в 22:34
  • 1
    относительно 1. Это не работает для меня. упрощает его ... Мое имя скрипта - «abcd». вы можете предположить, что там нет в системе другого скрипта с этим именем .. поэтому мне нужно только проверить, запущено ли это имя. Я не понимаю, что нужно заменить в коде. – avi 17 May 2017 в 13:16
  • 2
    @avi заменен? Почему нужно что-то заменить? Это может быть проще, если вы просто пинговали меня (@terdon) в чате . – terdon♦ 17 May 2017 в 13:17
  • 3
    Я не понимаю синтаксис. & Quot; $ {0 ## * /} & Quot; Это должно быть заменено моим именем скрипта, не так ли? также я не понимаю, что такое gt 1 Это возвращаемое значение pgrep? если 0 означает, что он уже запущен, а 1 означает, что ни один запуск howtounix.info/man/FreeBSD/man1/pgrep.1 – avi 17 May 2017 в 13:23
  • 4
    @avi no, -gt 1 просто означает «больше одного». В pgrep -c foo будет напечатано количество процессов с именем foo, которые в настоящее время запущены. И не используйте эту страницу руководства, инструменты FreeBSD часто сильно отличаются от Linux. – terdon♦ 17 May 2017 в 13:34

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

вывести скрипт, если он обнаруживает другой экземпляр сам. Просто добавьте эти строки в начало вашего скрипта: 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). Это означает, что если у вас есть другой, несвязанный скрипт с тем же именем, он все равно будет обнаружен. с другой стороны, это также означает, что он будет работать, даже если вы вызываете скрипт из символической ссылки. Какой из них вы предпочитаете, зависит от вашего варианта использования. Используйте файл блокировки и выйдите из сценария, если файл существует: #!/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"
5
ответ дан 18 July 2018 в 13:12

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

вывести скрипт, если он обнаруживает другой экземпляр сам. Просто добавьте эти строки в начало вашего скрипта: 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). Это означает, что если у вас есть другой, несвязанный скрипт с тем же именем, он все равно будет обнаружен. с другой стороны, это также означает, что он будет работать, даже если вы вызываете скрипт из символической ссылки. Какой из них вы предпочитаете, зависит от вашего варианта использования. Используйте файл блокировки и выйдите из сценария, если файл существует: #!/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
ответ дан 24 July 2018 в 20:07

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

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