Intereting Posts
Как определить пользователя и сервер с короткими командами? Преобразование файла UTF-8 в ASCII (наилучшее усилие) Policy Kit не работает должным образом? Ctrl-Alt-F1-F6 работают по-разному для левой и правой сторон клавиатуры Сравните два файла на основе значений в их последнем столбце Отключить вывод журнала на консоль Bash добавить конечные пробелы, чтобы оправдать строку В сценарии Cat in expect добавлена ​​новая строка до конца строки ускорение сочетания клавиш презентации Практическое руководство по управлению виртуальной памятью При установке пакета я могу предоставить разрешение на запись для определенных файлов? awk для удаления строки из переменной Руководство по загрузке BTX Есть ли недостаток в использовании «grep -E» вместо простого «grep»? Мне нужно создать модуль для новой программы или просто использовать существующую?

cron, каждую минуту

У меня есть cronjob, который запускает PHP в файле wordpress cron.php. В основном он используется для планирования сообщения, и я считаю, что он может обновить кеш.

Я запускаю работу cron каждую минуту. Я часто проверял ps, и я вижу, что TWO-экземпляр PHP работает cron.php. Теперь это не нужно, потому что запуск одного экземпляра сделает все, что ему нужно. У меня есть другое задание, которое проверяет наличие ram, и иногда два экземпляра отключают его (я ожидаю, что во время работы будет доступно большое количество бара, я могу опустить его, но я не хочу). Я вряд ли верю, что одна работа может занять больше минуты (хотя это возможно).

Как я могу запустить задание, но нет, если процесс уже существует? Я не думаю, что сам PHP-код может проверяться, если он не соединяет / не использует db? Можно ли использовать команду cron? Я не хочу убивать экземпляр, если его> 1 минута. Просто не создавайте новые.

Сделайте свой вход crontab следующим:

if mv /var/run/my-php-job.pending /var/run/my-php-job.running 2>/dev/null; then echo $$ >|/var/run/my-php-job.running # optional … # run the job : >|/var/run/my-php-job.running # optional mv /var/run/my-php-job.running /var/run/my-php-job.pending fi 

Поместите это в запись @reboot crontab:

 rm -f /var/run/my-php-job.running touch /var/run/my-php-job.pending 

Имя файла служит блокировкой. В то время как это .running , есть работа, и следующее задание не запустится. Когда это будет .pending , запущенное задание запускается и переключается на .running .

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

Если оболочка, запускающая работу, падает (что маловероятно, и только риски происходят, если кто-то сознательно убивает его или в условиях низкой памяти, файл блокировки застрянет в .running . (Если сама работа сбой, это не проблема). Вы можете обнаружить внезапную смерть предыдущего сценария, но это значительно сложнее.

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

 #!/bin/bash # Exit if process is already running if test -e /tmp/wordpress-job.pid; then # Check if the pid that was stored in /tmp/wordpress-job.pid does exist if ps ax -o pid= | grep $(cat /tmp/wordpress-job.pid ) &> /dev/null; then exit 0 fi fi # Create the file that marks this process as running echo $$ > /tmp/wordpress-job.pid # Some extra security check to prevent the pid file # to survive. trap "rm -f /tmp/wordpress-job.pid" EXIT TERM INT HUP # Start the long-running process in the background sleep 3600 & # long-running process # Sleep some time before trying to kill that process sleep 300 # Kill job if it takes longer than it should kill %1 # Delete the file that marks this process as running rm -f /tmp/wordpress-job.pid 

Вы должны заменить «sleep 3600» на вашу командную строку php и изменить 300 ниже до максимального времени, в течение которого ваш сценарий должен быть запущен.

Существуют специальные утилиты для избежания параллельных запусков: flock in util-linux, lockf в BSD-системах, блокировка в NetBSD и пакеты INN и cnews.

Скорее всего, случай (Linux) вызывает нечто похожее:

 flock -w 60 /somedir/lockfile cron.php 

Рецепты в других ответах – это альтернативы доморощенного стада и полезны только в случае отсутствия такого инструмента.

OTOH вы можете иметь дело с такой блокировкой в ​​своей программе напрямую, но вы должны тщательно повторить все детали, иначе вы можете создать условия гонки.