Назад | Перейти на главную страницу

Предотвращение дублирования заданий cron

я нашел эта интересная страница что предлагает несколько вариантов:

  1. Создать файл блокировки
  2. Создайте файл PID.
  3. flock
  4. solo

А как же его вариант:

Проверьте ps чтобы узнать, выполняется ли в настоящий момент выполненная команда.

ps-check.sh сценарий может быть даже включен в начало каждого создаваемого вами задания cron.)

Я предполагаю, что причина, по которой я не нашел такого решения, в том, что это плохая идея.

Почему это плохая идея?

ps-check.sh может вернуть 1, если команда уже выполняется. Скрипт cron может вызывать ps-check.sh как это:

#!/bin/bash
#some script

#get current script name into variable
#then use ps-check.sh to see if current script is already running
#by supplying it with 2 things: script name and current PID
me=`basename "$0"`    
if (( $(ps-check.sh $me $$) == 1)); then
  exit 1;
fi
# do more stuff

ps-check.sh проверит, запущен ли уже сценарий под другим PID.

Есть ли случай, когда скрипт будет запущен, но не будет отображаться в ps? Если спишь?

РЕДАКТИРОВАТЬ - Заключение:

Я решил пойти с flock. Проверка ps может сработать, но мне, вероятно, придется справиться с множеством условий, чтобы убедиться. Я предполагаю flock уже обрабатывает большинство из них.

Недостаток в использовании ps логика в том, что вы ожидаете обработать название быть уникальным.

Если вы всегда не запускаете свои процессы с абсолютным путем, другой пользователь (или вы сами) можете легко создать совершенно другой процесс с тем же именем, что предотвратит запуск вашего задания cron.

Я бы рекомендовал использовать один пробег команда - намного проще, чем разбираться с замками. Из документов:

один пробег - сценарий-оболочка, который запускает не более одного уникального экземпляра некоторой команды с уникальным набором аргументов. Это часто бывает полезно с cronjobs, когда вы хотите, чтобы одновременно выполнялось не более одной копии.

беги-это-один точно так же, как run-one, за исключением того, что он будет использовать pgrep и kill для поиска и уничтожения любых запущенных процессов, принадлежащих пользователю и соответствующих целевым командам и аргументам. Обратите внимание, что run-this-one будет блокироваться при попытке убить соответствующие процессы, пока все соответствующие процессы не будут мертвы.

бегать-один-постоянно работает точно так же, как run-one, за исключением того, что он воспроизводит "COMMAND [ARGS]" каждый раз, когда COMMAND завершается (ноль или ненулевое значение).

бежать это псевдоним для run-one-always.

беги один до успеха работает точно так же, как run-one-always, за исключением того, что он возрождает "COMMAND [ARGS]" до тех пор, пока COMMAND не завершится успешно (т.е. не завершится с нуля).

пробежать один до отказа работает точно так же, как run-one-always, за исключением того, что он возрождает «COMMAND [ARGS]» до тех пор, пока COMMAND не завершится с ошибкой (т. е. завершится ненулевым).