Задерживает ли задание cron последнее выполнение cron? - PullRequest
9 голосов
/ 12 мая 2009

У меня есть задание cron, которое выполняет скрипт PHP. Cron настроен на запуск каждую минуту, это делается только для целей тестирования. Выполняемый им PHP-скрипт предназначен для преобразования видео, загруженных пользователями на сервер, во флэш-формат (например, ... .flv). Сценарий выполняется нормально, когда выполняется вручную через командную строку, однако при выполнении через cron он запускается нормально, но через минуту он просто останавливается.

Кажется, что при выполнении следующего крона он "убивает" последнее выполнение крона. Я добавил следующую функцию PHP:

ignore_user_abort(true);

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

Любая помощь будет оценена.

Спасибо!

EDIT: Мой cron выглядит так:

*/1 * * * * php /path_to_file/convert.php

Ответы [ 3 ]

17 голосов
/ 12 мая 2009

Я не думаю, что cron убивает какие-либо процессы. Однако cron не очень подходит для длительных процессов. Здесь может происходить то, что ваш сценарий попирает весь сам по себе, когда он выполняется несколько раз. Например, оба PHP-процесса могут пытаться записать в один и тот же файл одновременно.

Во-первых, убедитесь, что вы не только просматриваете журнал ошибок php, но и пытаетесь захватить вывод из самого файла PHP. Например:

*/1 * * * * * php /path/to/convert.php & >> /var/log/convert.log

Вы также можете использовать упрощенный файл блокировки, чтобы убедиться, что convert.php не выполняется несколько раз. Что-то вроде:

if (file_exists('/tmp/convert.lock')) {
    exit();
}

touch('/tmp/convert.lock');
// convert here
unlink('/tmp/convert.lock');
3 голосов
/ 12 мая 2009

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

1 голос
/ 12 мая 2009

Нет, не будет. Вы можете предотвратить запуск второго процесса, создав файл блокировки, который проверяется сценарием при каждом запуске. Если файл существует, он не запускается. Это также следует, если необходимо, использовать в сочетании с максимальным временем выполнения, чтобы один процесс не останавливал будущие выполнения на неопределенный срок. Файл блокировки может быть просто пустым текстовым файлом с именем /tmp/foo.lock.

.
...