Подтвердить что ты не робот

Ошибка Tar: Неожиданный EOF в архиве при запуске через Cron/PHP

У меня есть консоль PHP script, которая вызывается через cron, которая сама по себе создает tar файл каталога.

При вызове PHP script через cron файл tar создается неправильно. При просмотре файла tar отображается следующая ошибка:

gzip: stdin: unexpected end of file
tar: Unexpected EOF in archive
tar: Error is not recoverable: exiting now

При вызове PHP script вручную через консоль tar файл создается правильно. Выход журнала cron не показывает ошибок.

Здесь tar-код формирует PHP script.

 exec("cd $this->backupTempFolderName/$id; tar -czf ../../$this->backupFolderName/$tarFileName $dbDumpFileName documents");

Доза у кого-нибудь есть идея, почему tar создается правильно при вызове вручную и терпит неудачу при вызове через cron?

Обновление. Ошибка при создании файла tar через cron:

tar: ../../backup/20150819-060003.tar.gz: Wrote only 4096 of 10240 bytes
tar: Error is not recoverable: exiting now

Иногда возникает ошибка:

tar: ../../backup/20150819-054002.tar.gz: Cannot write: Broken pipe
tar: Error is not recoverable: exiting now

Как было сказано ранее, при выполнении через cron tar файл создается, но всегда 50% от правильного размера (при ручном выполнении script):

-rw-r--r--  1 gtz gtz 1596099468 Aug 19 06:25 20150819-042330.tar.gz <- Manually called skript, working tar
-rw-r--r--  1 gtz gtz  858570752 Aug 19 07:21 20150819-052002.tar.gz <- Script called via cron, broken tar

Обновление 2

После дальнейших исследований, основанных на приведенном здесь входе, возможно, следует добавить, что cron с именем script работает на виртуальном частном сервере - я подозреваю, что некоторые ограничения могут существовать для заданий cron, которые не документируются хостером (в документах указывается только ограничение на минимальное время повторения).

4b9b3361

Ответ 1

Эта ошибка возникает, как правило, из-за нехватки дискового пространства.

Я бы сделал еще несколько исследований по этому вопросу, добавив несколько журналов до и после выполнения tar.

Также проверьте, какой пользователь использует ваша конфигурация для задания cron, на котором выполняется резервное копирование. Это может быть ограничение квоты для этого пользователя, что не происходит, когда вы запускаете консоль вне cron.

Попросите вашего провайдера ограничить квоты на VPS для пользователей и для процессов... Вот что звонит здесь.

Ответ 2

Я предполагаю, что у вас есть ограничение ресурсов Как сказал М. Иванов, добавьте эту команду в свой PHP script:

shell_exec("php -info");

и проверьте этот параметр как при выполнении команды script из командной строки, так и из задания cron

memory_limit => ???

Вы также можете попробовать запустить свой cron, увеличив предел памяти до 1600M

php -d memory_limit=1600M scriptCompressor.php

Надеюсь, что помогает:)

Ответ 3

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

Если вы используете cronjob из некоторого контейнера, например. Drupal, они имеют особые ограничения.

Также проверьте пределы bash: ulimit -a

Сообщите дисковое пространство перед началом резервного копирования, а затем на всякий случай. Обычно он довольно мал на VPS.

Ответ 4

Вы можете попробовать создать tarball непосредственно из PHP, чтобы избежать вызова exec. См. Этот ответ: fooobar.com/questions/245464/....

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

Ответ 5

Я уверен, что проблема с памятью или временем выполнения. Запустите один и тот же каталог script для каталога, который содержит только один тестовый файл и проверяет вывод, если ваш script работает в этом сценарии, а затем 100% уверен, что проблема с памятью.

попробуйте изменить параметр памяти и выполните script.

Надеюсь, это поможет вам.

Спасибо

Ответ 6

Глядя на следующую ошибку.

tar: ../../backup/20150819-054002.tar.gz: Cannot write: Broken pipe
tar: Error is not recoverable: exiting now

Я вижу, что поскольку функция exec в PHP script не блокирует или не вызывает ошибку преждевременно. Таким образом, сеанс PHP, вызываемый во время выполнения задания Cron, завершается до завершения команды. Это всего лишь предположение, но вы можете попытаться отправить это на задний план, когда вы запустите его из Cron.

exec("cd $this->backupTempFolderName/$id; tar -czf ../../$this->backupFolderName/$tarFileName $dbDumpFileName documents &");

Эта команда должна блокироваться, так что это просто выстрел в темноте.

http://php.net/manual/en/function.exec.php

Ответ 7

Ошибка при попытке выполнить файл php и дает ошибку EOF. Это означает, что где-то в вашем php файле вы должны проверить код своего cron файла, что может случиться, что вы забудете заполнить скобки условия или класса и т.д.

Удача ['}

Ответ 8

Чтобы записать ошибки в журнал при выполнении через cron, замените >/paht/to/application/app/logs/backup-output.log в линии cron на 2>&1 >/path/to/application/app/logs/backup-output.log Также проверьте путь в линии cron. Возможно, change-dir не работает, как вы думаете. Попробуйте печатать getcwd() в журнале или что-то в этом случае при запуске PHP скрипт из cron.

Изменить: Интересно, почему это было проголосовано not useful. Вопросник отметил, что ошибки не печатаются в журнале, когда cron выполняет script. Нетрудно представить, что > просто перенаправляет STDOUT, а не STDERR (на котором будут печататься php-ошибки) в журнал. Поэтому добавление 2>&1 может выявить некоторые новые сведения.