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


Получить помощь и пообщаться с другими пользователями Ubuntu можно
на irc канале #ubuntu-ru в сети Freenode
и в Jabber конференции ubuntu@conference.jabber.ru

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

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

Оффлайн Paullus

  • Автор темы
  • Новичок
  • *
  • Сообщений: 6
    • Просмотр профиля
То есть хочу запускать задачу каждые 10 минут, и если есть данные, начинать расчет, который длится около гораздо больше 10 минут. Как предотвратить запуск нескольких копий задачи, можно это сделать силами планировщика?
« Последнее редактирование: 05 Июля 2010, 10:53:49 от Владимир Николаевич »

Оффлайн wl

  • Старожил
  • *
  • Сообщений: 1393
    • Просмотр профиля
1. В начале программы проверять, есть ли в спискре процессов еще копии, если есть, выходить.
2. Создавать в /var/run/ файл и ставить на него замок (flock). При запуске проверять наличие этого файла и наличие замка на нем. Если есть, выходить. По завершении работы - удалять файл.
На свете феньки есть такие, брат Горацио, которых лохи просто не секут. (Шекспир, "Гамлет", вольный перевод)

Оффлайн Sly_tom_cat

  • Don't worry, be happy!
  • Заслуженный пользователь
  • Старожил
  • *
  • Сообщений: 12130
  • Xubuntu 22.04
    • Просмотр профиля
    • Github
... По завершении работы - удалять файл.
... а также удалять файл при выходе из обработчика по ошибке.
Индикатор для Yandex-Disk: https://forum.ubuntu.ru/index.php?topic=241992
UEFI-Boot - грузимся без загрузчика: https://help.ubuntu.ru/wiki/uefiboot

Оффлайн Paullus

  • Автор темы
  • Новичок
  • *
  • Сообщений: 6
    • Просмотр профиля
2. Создавать в /var/run/ файл и ставить на него замок (flock). При запуске проверять наличие этого файла и наличие замка на нем. Если есть, выходить. По завершении работы - удалять файл.
А почему в /var/run, а не в текущей директории? И вообще, по правде говоря, насчет замка ничего не понятно. Как это сделать вообще?

Оффлайн Mam(O)n

  • Старожил
  • *
  • Сообщений: 5855
    • Просмотр профиля
Попробуй обратить внимание на утилиту start-stop-daemon. Он и файл.pid в /var/run создаст и проверит на наличие запущенного процесса.

Оффлайн Paullus

  • Автор темы
  • Новичок
  • *
  • Сообщений: 6
    • Просмотр профиля
пока буду отслеживать запущенный процесс с помощью pgrep

Оффлайн alecsartania

  • Старожил
  • *
  • Сообщений: 1564
  • УМка.
    • Просмотр профиля
... По завершении работы - удалять файл.
... а также удалять файл при выходе из обработчика по ошибке.
а так же при старте системы ...
Дома Linux Mint 20.1 / 20.02

Оффлайн Sly_tom_cat

  • Don't worry, be happy!
  • Заслуженный пользователь
  • Старожил
  • *
  • Сообщений: 12130
  • Xubuntu 22.04
    • Просмотр профиля
    • Github
а так же при старте системы ...

Если в правильном каталоге создавать лок - то перезагрузка все там потрет. Т.к. по умолчанию - /var/run в tempfs монтируется - т.е. в рамдиск. Или я не прав? :idiot2:
Индикатор для Yandex-Disk: https://forum.ubuntu.ru/index.php?topic=241992
UEFI-Boot - грузимся без загрузчика: https://help.ubuntu.ru/wiki/uefiboot

Оффлайн Paullus

  • Автор темы
  • Новичок
  • *
  • Сообщений: 6
    • Просмотр профиля
решил сделать очень просто так:
*/10 * * * * if ! pgrep myprogram; then /home/user/myprogram; fiкаждые 10 минут запускается, если еще не запущена, программа myprogram

Оффлайн wl

  • Старожил
  • *
  • Сообщений: 1393
    • Просмотр профиля
Я про замок не зря написал. Его использование позволяет не заботиться об удалении файла в критических ситуациях.

man flock
man 2 flock

Программа должна проверять наличие и файла, и замка на нем. Если есть и то, и то, значит, копия процесса в памяти точно есть.
Если файл есть, а замка нет, значит, в предыдущий раз программа завершилась аварийно, и можно этот файл удалять или перезаписывать.

решил сделать очень просто так:
*/10 * * * * if ! pgrep myprogram; then /home/user/myprogram; fiкаждые 10 минут запускается, если еще не запущена, программа myprogram
Вполне имеет право на существование. Надо только помнить, что еще одну копию запросто можно запустить из командной строки.

Я вот так делаю:
#include <fcntl.h>

int lock_fd;
struct flock lock_st;
сhar chpid[7];

lock_fd = creat(lock_file,0600);

memset(&lock_st,0,sizeof(lock_st));
lock_st.l_type=F_WRLCK;
lock_st.l_whence=SEEK_SET;

int res=fcntl(lock_fd,F_SETLK,&lock_st);
if(res < 0) {
  fprintf ( stderr,"Unable to place a lock to file %s, code=%d (%s)\n",lock_file, errno, strerror(errno) );
  exit(EXIT_FAILURE);
}

snprintf(chpid,6,"%d",getpid());
write(lock_fd,chpid,7);
« Последнее редактирование: 24 Июня 2010, 16:23:20 от wl »
На свете феньки есть такие, брат Горацио, которых лохи просто не секут. (Шекспир, "Гамлет", вольный перевод)

Оффлайн Paullus

  • Автор темы
  • Новичок
  • *
  • Сообщений: 6
    • Просмотр профиля
Я вот так делаю:
мне бы для баша...

А ман этот я уже сто раз читал, и у меня сложилось ощущение, что его написали, чтобы поглумиться над моим незнанием.

Оффлайн wl

  • Старожил
  • *
  • Сообщений: 1393
    • Просмотр профиля
Вот это может помочь. Сам не пробовал.

Цитата: man flock
The third form is convenient inside shell scripts, and is usually used the following manner:
    flock [-sxun] [-w timeout] fd
...
       (
         flock -s 200
         # ... commands executed under lock ...
       ) 200>/var/lock/mylockfile

Приведенный кусок кода запускает отдельный процесс bash для всего, что перечислено в скобках. Все, что пишется оттуда в файловый дескриптор 200, отправляется в файл /var/lock/mylockfile. bash создает этот файл и открывает дескриптор 200 у порождаемого процесса.
Внутри скобок команде flock говорится наложить замок на файл с дескриптором 200.
Если замок на файле /var/lock/mylockfile уже закрыт, команда flock будет ждать его открытия.
Можно использовать ее ключ -n, тогда она просто должна завершить выполнение этого куска кода с ошибкой.

Ссылки по теме:
http://tldp.org/LDP/abs/html/ Главы 20 и 21.
« Последнее редактирование: 24 Июня 2010, 17:24:33 от wl »
На свете феньки есть такие, брат Горацио, которых лохи просто не секут. (Шекспир, "Гамлет", вольный перевод)

Оффлайн Paullus

  • Автор темы
  • Новичок
  • *
  • Сообщений: 6
    • Просмотр профиля
Вот это может помочь. Сам не пробовал.
Вроде работает с ключом -n
Все же замки мне пока непонятны, разбираться с ними времени нету. Я думал что это просто файл закрытый от записи, но судя по всему это не совсем так.
За ссылку спасибо.

Оффлайн wl

  • Старожил
  • *
  • Сообщений: 1393
    • Просмотр профиля
Все же замки мне пока непонятны. Я думал что это просто файл закрытый от записи, но судя по всему это не совсем так.
В отличие от винды, в линуксе нельзя сделать полностью закрытый от записи/чтения/удаления файл, ибо root должен мочь все.
Поэтому замки там рекомендательные (advisory), т.е. процесс должен явно проверять, не занят ли файл другим процессом и явно прекращать/приостанавливать свое выполнение, если это так.
На свете феньки есть такие, брат Горацио, которых лохи просто не секут. (Шекспир, "Гамлет", вольный перевод)

Оффлайн ArcFi

  • Старожил
  • *
  • Сообщений: 15189
    • Просмотр профиля
    • aetera.net
В кроне прописаны задания:
@daily root task1
@weekly root task2
Каким образом можно отложить выполнение task2 до тех пор, пока не завершится task1? ???

При условии, что расчитать время выполнения task1 не представляется возможным.
« Последнее редактирование: 03 Июля 2010, 04:39:29 от ArcFi »

 

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