Як планувати серверні завдання більш розумно, ніж із cron?


15

Я щогодини запускаю роботу, щоб переосмислити вміст свого сайту.

Сьогодні пошукова система померла, і коли я ввійшов у систему, було сотні сирітських процесів, які були розпочаті cron.

Чи є інший спосіб використання якогось наявного програмного забезпечення, яке дозволить мені виконувати завдання щохвилини, але це не запустить інший екземпляр, якщо ця робота не повернеться (тобто через те, що процес пошукової системи не вдався)?


4
cron, швидше за все, робить саме те, що ви говорите. Я пропоную натомість переписати роботу розумно.
gparent

Відповіді:


27

Проблема насправді не з cron - це з вашою роботою.

Вам потрібно буде, щоб ваша робота взаємоділа із замком якогось опису. Найпростіший спосіб зробити це - спробувати створити каталог, і якщо успіх продовжується, якщо не вийти. Після завершення роботи та завершення роботи вона повинна видалити каталог, готовий до наступного запуску. Ось сценарій для ілюстрації.

#!/bin/bash

function cleanup {
    echo "Cleanup"
    rmdir /tmp/myjob.lck
}

mkdir /tmp/myjob.lck ||  exit 1
trap cleanup EXIT
echo 'Job Running'
sleep  60
exit 0

Запустіть це в одному терміналі, а потім до запуску 60 секунд запустіть його в інший термінал, він вийде зі статусом 1. Після першого процесу ви можете запустити його з другого терміналу ...

Редагувати:

Щойно я дізнався про зграю, я думав, що оновлю цю відповідь. flock (1) може бути простішим у використанні. У цьому випадку це flock -nможе здатися, наприклад

* * * * * /usr/bin/flock -n /tmp/myAppLock.lck /path/to/your/job   

Запускав би свою роботу щохвилини, але не зміг, якби зграя не змогла отримати замок у файлі.


2
Дурне запитання, можливо, але чи є якісь переваги щодо використання каталогу, а не звичайного файлу?
геп

9
Використання звичайного файлу вимагає декількох операцій, перевірте, чи існує він, чи він не створює його. Це залишає вікно можливості для іншого процесу створення файлу - безладно. Mkdir - це атомна операція, яка працює, і ви отримуєте "замок", або це не так, як інший процес вже має його.
користувач9517

Має сенс. Добре подумайте і про каталог блокування. Спасибі
Іван

2

Одним із способів було б, щоб ваш скрипт reindex створив файл блокування, щоб він міг перевірити, чи вже існує екземпляр запущеного сценарію. Ви також можете додати обробку винятків, щоб побачити, чи працює пошукова система.

Більш задіяною альтернативою було б використання такої черги завдань, як Resque та Resque-планувальник:

https://github.com/blog/542-introducing-resque

https://github.com/bvandenbos/resque-scheduler#readme

Також є Qu і Sidekiq:

https://github.com/bkeepers/qu

https://github.com/mperham/sidekiq

Так, на це все орієнтується на Ruby, але ви можете шукати "речі, як resque" мовою, яку ви обрали.


0

Ще один спосіб швидко налаштувати це - запустити скрипт оболонки при запуску машини (cron може це зробити за допомогою ' @reboot /path/to/my/script.sh',. Потім перезапустити cron, щоб запустити його) з чимось подібним у ньому.

#!/bin/sh
/opt/bin/run-site-index
sleep 60
exec $0

Сценарій продовжує працювати, і чи ви запустили лише один - ось скільки може бути запущено одразу - не більше того. Деякі розумні пристрої також можуть перевірити, чи працює індексатор, а якщо ні, то перезавантажте або іншим чином спробуйте виправити / повідомити когось про проблему.


-3

Замість використання cron для цього я буду будувати свою роботу більше як службу, яка працює в циклі і спить протягом 60 секунд як останній крок, або, можливо, спить частіше за менші інтервали в різні моменти під час процесу, щоб допомогти розподілити навантаження рівномірніше.


1
Це не вирішило б це питання і не було б поліпшенням з боку cron.
gparent

Це вирішило б проблему, адже тоді існує лише один процес, який запускається коли-небудь. Це повністю би сторонило крона.
Джоел Коель

Це не вирішує проблему, якщо "сервіс" не виглядає, якщо пошукова система працює. Логіка його сценарію / завдання - це питання. EDIT: Насправді ви дещо праві, це приховало б питання потворно.
геп
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.