Убивает ли задание cron последнее выполнение cron?

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

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

ignore_user_abort(true);

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

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

Спасибо!

РЕДАКТИРОВАТЬ: Моя cron выглядит так:

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

person Patrik Johansson    schedule 12.05.2009    source источник
comment
Вы проверяли журнал ошибок PHP? Вы использовали set_time_limit, чтобы установить ограничение по времени на 0?   -  person Bart S.    schedule 12.05.2009
comment
Никаких ошибок не возникает, я также установил ограничение по времени на 0. Я забыл упомянуть ранее, что мой cron выглядит так: ‹pre› * / 1 * * * * php /path_to_file/convert.php ‹/pre› Спасибо!   -  person Patrik Johansson    schedule 12.05.2009
comment
Похоже, что задание cron не перезаписывает то, над чем оно работало последним, в PHP-коде была какая-то ошибка. Я добавил проверку, чтобы убедиться, что он завершается, однако добавление временного файла блокировки, о котором упоминал Сандер, отлично сработало. Спасибо!   -  person Patrik Johansson    schedule 12.05.2009


Ответы (3)


Я не думаю, что 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');
person Sander Marechal    schedule 12.05.2009
comment
cron НЕ БУДЕТ убивать процесс. Сценарий (или что-то, что он вызывает) мешает. - person Michael Kohne; 12.05.2009

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

person paxdiablo    schedule 12.05.2009

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

person Jeff Ober    schedule 12.05.2009