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


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

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

ignore_user_abort(true);

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

Буду признателен за любую помощь.

Спасибо вам!

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

*/1 * * * * php /path_to_file/convert.php
Author: WhiteKnight, 2009-05-12

3 answers

Я не думаю, что 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');
 17
Author: Sander Marechal, 2009-12-02 23:05:55

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

 3
Author: paxdiablo, 2009-05-12 09:23:31

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

 1
Author: Jeff Ober, 2009-05-12 12:22:11