Форум русскоязычного сообщества Ubuntu


Увидели сообщение с непонятной ссылкой, спам, непристойность или оскорбление?
Воспользуйтесь ссылкой «Сообщить модератору» рядом с сообщением!

Автор Тема: Как заблокировать запуск задания планировщиком cron если задание уже выполняется  (Прочитано 4701 раз)

0 Пользователей и 1 Гость просматривают эту тему.

jericho

  • Гость
Цитировать
Каким образом можно отложить выполнение task2 до тех пор, пока не завершится task1?
Запускать task2 из task1, раз уж они связаны.

Оффлайн ArcFi

  • Старожил
  • *
  • Сообщений: 15189
    • Просмотр профиля
    • aetera.net
Запускать task2 из task1, раз уж они связаны.
task2 требуется запускать значительно реже.

ps
А есть ещё и task3, которое надо стартовать лишь раз в месяц, но после выполнения task1 и task2.

ps2
Хотелось бы по возможности обойтись средствами cron для настройки периодичности выполнения.

Оффлайн alexander.pronin

  • Старожил
  • *
  • Сообщений: 2539
    • Просмотр профиля
По сути вопроса. Чтобы предовратить запуск еще одного экземпляра задачи task, надо внутри скрипта определить, что она уже не запущена 2 раза (предыдущий и теперешний, который собственно и проверяет).
Как ?
ps -ef | grep task | grep -v grep | wc-l
и т.д.

Оффлайн ArcFi

  • Старожил
  • *
  • Сообщений: 15189
    • Просмотр профиля
    • aetera.net
Чтобы предовратить запуск еще одного экземпляра задачи task...
Не предотвратить, а заблокировать (отложить) до момента завершения другого процесса.
« Последнее редактирование: 05 Июля 2010, 10:42:00 от ArcFi »

Оффлайн wl

  • Старожил
  • *
  • Сообщений: 1393
    • Просмотр профиля
Не предотвратить, а заблокировать (отложить) до момента завершения другого процесса.
Use file locks Luke!
Все то же самое.
task1 при старте создает файл и ставит на него замок. При выходе - удаляет.
task2 при старте проверяет наличие файла и замка на нем, если все в наличии - ждет, пока замок не снимут.
« Последнее редактирование: 05 Июля 2010, 11:09:31 от wl »
На свете феньки есть такие, брат Горацио, которых лохи просто не секут. (Шекспир, "Гамлет", вольный перевод)

Оффлайн alexander.pronin

  • Старожил
  • *
  • Сообщений: 2539
    • Просмотр профиля
Не предотвратить, а заблокировать (отложить) до момента завершения другого процесса.
Надо подправить название темы, чтобы не было вопросов.

Оффлайн truegeek

  • FPGA Designer
  • Почётный модератор
  • Старожил
  • *
  • Сообщений: 4214
  • аЦкий схемотехник
    • Просмотр профиля

Оффлайн ArcFi

  • Старожил
  • *
  • Сообщений: 15189
    • Просмотр профиля
    • aetera.net
Так-с, ещё раз расставлю все точки над ё...

В кроне прописаны задания:
@daily root task1
@weekly root task2
@monthly root task3

Каким образом можно заблокировать выполнение task2 до тех пор, пока не завершится task1, соответственно, заблокировать task3, пока не завершится task2.

Поправки:
1. Расчитать время выполнения task{1..3} не представляется возможным, но предполагается, что время выполнения task{1..3} меньше их периода.
2. Хотелось бы по возможности обойтись средствами cron для настройки периодичности выполнения, т.е. можно считать, что задания запускаются независимо друг от друга.
3. Задания task{1..3} являются bash-скриптами.

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


В общем, я это вижу как частный случай механизма синхронизации процессов, работающих с критическими секциями, когда весь процесс можно считать критической секцией.
В идеале, хотелось бы не изобретать велосипед а воспользоваться чем-то типа flock, только вот имеются ли такие средства... Интуиция подсказывает, что должны быть.
« Последнее редактирование: 05 Июля 2010, 11:49:10 от ArcFi »

Оффлайн wl

  • Старожил
  • *
  • Сообщений: 1393
    • Просмотр профиля
ArcFi, Вы ли это?

В идеале, хотелось бы не изобретать велосипед а воспользоваться чем-то типа flock, только вот имеются ли такие средства... Интуиция подсказывает, что должны быть.
man flock
man 2 flock
Почему нужно обязательно "что-то типа"? Чем flock не подходит?

На свете феньки есть такие, брат Горацио, которых лохи просто не секут. (Шекспир, "Гамлет", вольный перевод)

Оффлайн ArcFi

  • Старожил
  • *
  • Сообщений: 15189
    • Просмотр профиля
    • aetera.net
:2funny: Видимо, я не сразу правильно понял принцип работы этого flock.

Код: (/etc/crontab) [Выделить]
LOCKFILE=/var/lock/task
@daily root flock $LOCKFILE task1
@weekly root flock $LOCKFILE task2
@monthly root flock $LOCKFILE task3
Усё, на первое время.

Оффлайн alexander.pronin

  • Старожил
  • *
  • Сообщений: 2539
    • Просмотр профиля
Бывает и старуху проруха. Но очень редко. :idiot2:

Оффлайн wl

  • Старожил
  • *
  • Сообщений: 1393
    • Просмотр профиля
task3 может запуститься раньше task2

Может, так:
Код: (/etc/crontab) [Выделить]
LOCKFILE1=/var/lock/task12
LOCKFILE2=/var/lock/task23
@daily root flock $LOCKFILE1 task1
@weekly root flock $LOCKFILE1 flock $LOCKFILE2 task2
@monthly root flock $LOCKFILE2 task3

На свете феньки есть такие, брат Горацио, которых лохи просто не секут. (Шекспир, "Гамлет", вольный перевод)

Оффлайн ArcFi

  • Старожил
  • *
  • Сообщений: 15189
    • Просмотр профиля
    • aetera.net

 

Страница сгенерирована за 0.064 секунд. Запросов: 25.