Последовательный запуск команд из Крона

Если добавить фоновые задачи в Крон, есть риск, что они будут перекрываться при выполнении. В таком случае скрипты могут работать некорректно или просто жрать лишние ресурсы. Для гарантии последовательного запуска сделал blocker.sh.

Использование:

*/10 * * * * /usr/local/bin/blocker.sh job_id "/var/www/Envs/prj/command_name command_parameters"

Он не позволит запускаться двум задачам с одним job_id.
С помощью job_id можно объединять и несколько задач, которые не должны выполняться одновременно.
В своей работе скрипт опирается на использование временного файла с pid процесса. Он создается в /tmp. Если при старте есть файл, соответствующий job_id, то он проверяет, запущен ли процесс с pid, который указан в файле. Если да, новый экземпляр не запускается.
Если запуск разрешен, создается временный файл, запускается процесс, а по завершении файл удаляется.
Сам код:

name=$1
case "$name" in
  */*)
    echo "Command ID can't use slashes"
    exit 1
esac
file="/tmp/blocker-"$1
if [ -e $file ]
then
  pid=`cat $file`
  lines=`ps $pid | wc -l`
  if [ $lines -gt 1 ]
  then
    echo "Another instance of $name is already running"
    exit 1
  fi
fi

pid=$$
echo $pid > $file
$2
rm $file

Проверка на наличие слэша в job_id нужна, чтобы уменьшить вероятность указания реального файла вместо идентификатора. Проверка через case работает и в /bin/sh.

Последовательный запуск команд из Крона

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out /  Change )

Google photo

You are commenting using your Google account. Log Out /  Change )

Twitter picture

You are commenting using your Twitter account. Log Out /  Change )

Facebook photo

You are commenting using your Facebook account. Log Out /  Change )

Connecting to %s