2010-06-29 3 views
2

Мне нужно остановить перекрытие заданий cron, например: если задание cron запланировано утром 2 o для резервного копирования БД, а другое задание cron запланировано утром 7 o для Резервное копирование БД снова. Поэтому мне нужно остановить запланированное задание cron на 7 часов, если резервная копия БД для 2 часов не завершена.Код для прекращения перекрытия задания Cron

+0

Почему это помечены java, C++, perl? – shinynewbike

+0

Вам нужен код для всех 3 lanuguages? ps: давайте расписанию снова расписываться? – Redlab

+0

в моем php-коде, когда задание cron запускается, он сначала проверяет базу данных, если выполняется задание cron, тогда, когда его нет, он добавит, что выполняется работа cron, так что таким образом она не будет перекрываться , – gfivehost

ответ

0

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

Это взломать и действительно работает, потому что ваши рабочие места расположены на расстоянии друг от друга.

3

Самый простой способ сделать это - установить координаты ваших задач 2am и 7am. Так, например, сценарий резервного копирования базы данных может создавать файл блокировки при его выполнении и проверять наличие этого файла при его запуске. Если файл существует, он может просто выйти без какой-либо работы (или спящий бит, или что бы вы ни решили).

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

+0

Необходимо будет заблокировать файл блокировки (если сценарий резервного копирования сработает, а файл блокировки не будет очищен), или, возможно, игнорируется, если оно превышает 24 часа. Лучше спросить базу данных, если она будет скопирована (если это возможно в этом случае). –

1

Вам просто нужно что-то, что вы можете проверить, чтобы проверить, закончилась ли первая задача, и эта проверка должна быть выполнена прямо перед повторным запуском задания.

Я бы реализовал это с помощью базы данных (если таковой имеется) или регистрационного ключа или даже текстового файла. Так что ваша задача будет выглядеть следующим образом:

read job_flag 
    if job_flag == 0 
    step job_flag = 1 
    run job 
    step job_flag = 0 
    else 
    stop job 
    end 
2

Предполагая, что вы в системе Unix: Самый простой способ сделать это создать файл и записать PID в хрон к нему. Если файл не может быть , созданный с использованием open(2) с флагами O_CREAT|O_EXCL, он уже существует, при этом предыдущее задание все еще работает или разбилось без очистки. PID может использоваться для определения того, работает ли работа .

В вашем случае самый безопасный подход, вероятно, предназначен для выполнения задания cron , если файл PID находится при запуске.

Поскольку вы положили perl тег на вопрос, я предлагаю взглянуть на в File::Pid и Proc::PID::File модулей.

6

Это то, для чего стадо. От man flock:

... 
The third form is convenient inside shell scripts, and is usually used 
     the following manner: 

     (
     flock -n 9 || exit 1 
     # ... commands executed under lock ... 
     ) 9>/var/lock/mylockfile 
... 

В этом случае, стадо будет пытаться получить блокировку на дескрипторе 9 для /var/lock/myfile. Если он не может (потому что предыдущая работа все еще запущена), он будет завершен.

Вам нужно поместить его в сценарий.

+0

Это отличный ответ, он хорошо работает. Это помогает сделать функцию bash, которая будет вызвана в «командах, выполняемых под блокировкой», чтобы помочь читаемости! – Drasill

0

Почему бы просто не сделать это за одну работу cron?

/path/to/job1 && /path/to/job2 
0


Вот мое решение:

$ crontab -l 
* * * * * cd /patch/to/script; . /patch/to/.profile; overlap.pl process.sh -t Device || process.sh -t Device 
$ 
$ 
$ cat overlap.pl 
#!/usr/bin/env perl 
use warnings; 
use strict; 

my $cmd = join(' ',@ARGV); 
my @result = `pgrep -f \"$cmd\"`; 
scalar @result > 2 ? exit 0 : exit 1; 

ОБЪЯСНЕНИЕ:

  • это задание выполняется скрипт каждую минуту, чтобы проверить, работает ли он (* * * * *)
  • Задача cron сложна, каталог изменений fisrt, профиль нагрузки, поэтому мне нужно запустить скрипт непосредственно из этого задания, а не из скрипта, который проверяет если перекрывается
  • , а затем проверить, работает ли этот конкретный процесс с теми же параметрами (overlap.pl с точной командой, которую я хочу проверить)
  • если «нет», возврат 0, если «да», возврат> 0
  • то логично «или» проверка результата и запуск желаемого сценария или не

Обратите внимание на длину массива в overlap.pl, вы можете проверить это самостоятельно, выполнив `пс -elf | grep \ "$ cmd \" >>/tmp/croncheck`;

Смежные вопросы