Мне нужно остановить перекрытие заданий cron, например: если задание cron запланировано утром 2 o для резервного копирования БД, а другое задание cron запланировано утром 7 o для Резервное копирование БД снова. Поэтому мне нужно остановить запланированное задание cron на 7 часов, если резервная копия БД для 2 часов не завершена.Код для прекращения перекрытия задания Cron
ответ
Вы можете сделать это только с помощью cron. Вам нужно будет добавить некоторую логику к вашему сценарию или коду, чтобы проверить, работает ли другой или нет. Общий взлом должен был бы проверить ваш скрипт на наличие определенного файла. Если он не существует, вы должны создать этот файл, выполнить резервное копирование и удалить его. Если файл существует, ничего не делайте.
Это взломать и действительно работает, потому что ваши рабочие места расположены на расстоянии друг от друга.
Самый простой способ сделать это - установить координаты ваших задач 2am и 7am. Так, например, сценарий резервного копирования базы данных может создавать файл блокировки при его выполнении и проверять наличие этого файла при его запуске. Если файл существует, он может просто выйти без какой-либо работы (или спящий бит, или что бы вы ни решили).
Выполнение этого полностью агностическим способом может быть возможным, но в данном конкретном случае это будет сложнее и ненужно.
Необходимо будет заблокировать файл блокировки (если сценарий резервного копирования сработает, а файл блокировки не будет очищен), или, возможно, игнорируется, если оно превышает 24 часа. Лучше спросить базу данных, если она будет скопирована (если это возможно в этом случае). –
Вам просто нужно что-то, что вы можете проверить, чтобы проверить, закончилась ли первая задача, и эта проверка должна быть выполнена прямо перед повторным запуском задания.
Я бы реализовал это с помощью базы данных (если таковой имеется) или регистрационного ключа или даже текстового файла. Так что ваша задача будет выглядеть следующим образом:
read job_flag
if job_flag == 0
step job_flag = 1
run job
step job_flag = 0
else
stop job
end
Предполагая, что вы в системе Unix: Самый простой способ сделать это создать файл и записать PID в хрон к нему. Если файл не может быть , созданный с использованием open(2)
с флагами O_CREAT|O_EXCL
, он уже существует, при этом предыдущее задание все еще работает или разбилось без очистки. PID может использоваться для определения того, работает ли работа .
В вашем случае самый безопасный подход, вероятно, предназначен для выполнения задания cron , если файл PID находится при запуске.
Поскольку вы положили perl
тег на вопрос, я предлагаю взглянуть на в File::Pid
и Proc::PID::File
модулей.
Это то, для чего стадо. От 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
. Если он не может (потому что предыдущая работа все еще запущена), он будет завершен.
Вам нужно поместить его в сценарий.
Это отличный ответ, он хорошо работает. Это помогает сделать функцию bash, которая будет вызвана в «командах, выполняемых под блокировкой», чтобы помочь читаемости! – Drasill
Почему бы просто не сделать это за одну работу cron?
/path/to/job1 && /path/to/job2
Вот мое решение:
$ 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`;
- 1. Создание задания cron для mysqldump
- 2. Рабочий каталог для задания Cron
- 3. Выражение Cron для задания задачи
- 4. Что такое код для вызова задания cron из php?
- 5. Как написать PHP-код для выполнения задания CRON?
- 6. Убить задание задания cron
- 7. Создание файла задания cron
- 8. Выполнение задания Cron непрерывно
- 9. Синтаксис задания работы Cron
- 10. Запуск задания Cron
- 11. Создание именованного задания Cron
- 12. Выделить один процесс для задания CRON node.js
- 13. Использовать PHP для создания задания cron
- 14. Код jQuery для проверки и прекращения отправки
- 15. Cron задания не работает файл
- 16. Синтаксис задания Cron для заданий кварца
- 17. Настройка задания cron для базы данных datetime
- 18. Использовать php для установки задания cron
- 19. Разрешение отклонено для выполнения задания cron
- 20. Настройка задания cron для выполнения скрипта PHP
- 21. PHP-скрипт для задания времени работы cron
- 22. Как вы развертываете задания cron для производства?
- 23. Как показать таймер для задания cron
- 24. Как предоставить разрешение для файла задания cron?
- 25. Spotify API Авторизация для задания cron
- 26. Ошибка установки задания CRON для сервера Amazon
- 27. Настройки задания на Wordpress cron
- 28. Cron задания вывода на консоль
- 29. Выполнение задания cron по PHP
- 30. настройка задания cron в magento
Почему это помечены java, C++, perl? – shinynewbike
Вам нужен код для всех 3 lanuguages? ps: давайте расписанию снова расписываться? – Redlab
в моем php-коде, когда задание cron запускается, он сначала проверяет базу данных, если выполняется задание cron, тогда, когда его нет, он добавит, что выполняется работа cron, так что таким образом она не будет перекрываться , – gfivehost