2009-05-12 5 views
9

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

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

ignore_user_abort(true); 

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

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

Спасибо!

EDIT: Мой хрон выглядит следующим образом:

*/1 * * * * php /path_to_file/convert.php 
+0

Вы проверили журнал ошибок PHP? Вы использовали set_time_limit, чтобы установить ограничение по времени на 0? –

+0

Ошибок не возникает, я также установил ограничение на 0. Я забыл упомянуть ранее, что мой cron выглядит так:

 */1 * * * * php /path_to_file/convert.php 
Спасибо! –

+0

Кажется, что задание cron не перезаписывает то, что работает на последнем, в PHP-коде было что-то неправильное. Я добавил проверку, чтобы убедиться, что она завершена, однако добавление временного файла блокировки, о котором упоминал Сандер, отлично работает. Спасибо! –

ответ

17

Я не думаю, что 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

cron НЕ будет убивать процесс. Скрипт (или что-то, что вызывает скрипт) получает по-своему. –

3

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

1

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

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