Error de tar: EOF inesperado en el archivo cuando se ejecuta a través de Cron/PHP
(8)
Tengo un script de consola de PHP que se llama a través de cron que, entre otras cosas, crea un archivo tar de un directorio.
Al llamar al script PHP a través de cron, el archivo tar no se crea correctamente. Se da el siguiente error al ver el archivo tar:
gzip: stdin: unexpected end of file
tar: Unexpected EOF in archive
tar: Error is not recoverable: exiting now
Al llamar al script PHP manualmente a través de la consola, el archivo tar se crea correctamente. La salida del registro cron no muestra errores.
Aquí la llamada al tar desde el script PHP.
exec("cd $this->backupTempFolderName/$id; tar -czf ../../$this->backupFolderName/$tarFileName $dbDumpFileName documents");
¿Alguien tiene una idea de por qué el tar se crea correctamente cuando se llama manualmente y falla cuando se llama a través de cron?
Actualización : El error dado al crear el archivo tar a través de cron es:
tar: ../../backup/20150819-060003.tar.gz: Wrote only 4096 of 10240 bytes
tar: Error is not recoverable: exiting now
A veces el error es:
tar: ../../backup/20150819-054002.tar.gz: Cannot write: Broken pipe
tar: Error is not recoverable: exiting now
Como se dijo anteriormente, cuando se ejecuta a través de cron, se crea el archivo tar, pero siempre el 50% del tamaño correcto (cuando se ejecuta manualmente el 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
Actualización 2
Después de realizar una investigación adicional basada en la entrada proporcionada aquí, es posible que se agregue que el script llamado cron se está ejecutando en un servidor privado virtual. Sospecho que pueden existir algunas limitaciones para los trabajos cron que no están documentados por el proveedor (solo límite en el mínimo). tiempo de repetición se da en los documentos).
El error se produce cuando intenta ejecutar el archivo php y le da un error EOF. Significa que en algún lugar de su archivo php debe verificar el código de su archivo cron. Puede suceder que olvide completar los paréntesis de la condición o clase, etc.
Buena suerte [''}
Es posible que desee intentar crear el archivo comprimido directamente desde PHP para evitar la llamada exec
. Vea esta respuesta en https://.com/a/20062628/5260945 .
Además, al mirar su entrada cron, no hay una barra diagonal inicial en su ejemplo. Sé que esto podría ser un error tipográfico para el comentario, pero asegúrese de tener una ruta absoluta para el comando cd
. El entorno predeterminado para un trabajo cron no es el mismo que para su shell de inicio de sesión.
Ese error viene generalmente de la falta de espacio en disco.
Haría un poco más de investigación sobre este tema, agregando algunos registros antes y después de la ejecución del alquitrán.
También verifique qué usuario está usando su configuración para el trabajo cron que tiene ejecutando la copia de seguridad. También puede haber algún límite de cuota para ese usuario, eso no sucede cuando se ejecuta en la consola fuera de cron.
Pregunte a su proveedor por los límites de cuota en el VPS para usuarios y procesos ... Eso es lo que suena aquí.
Estoy seguro de que su memoria o problema de tiempo de ejecución. Haga una cosa, ejecute el mismo script para el directorio que contiene un solo archivo de prueba y verifique la salida, si su script funciona en este escenario, entonces 100% seguro de su problema de memoria.
Intenta ajustar el parámetro de memoria y ejecuta tu script.
Espero que esto te ayude.
Gracias
Los cronjobs solos por lo general no tienen límites. Si está utilizando un alojamiento compartido, es posible que hayan instalado algunos scripts de ejecución, pero sospecho que también romperían las copias de seguridad de su consola.
Si está ejecutando cronjobs desde algún contenedor, por ejemplo, Drupal, tienen límites especiales.
También puedes ver los límites de bash con: ulimit -a
Reporte el espacio en el disco antes de que comience la copia de seguridad y luego por si acaso. Por lo general, es bastante pequeño en VPS.
Mirando el siguiente error.
tar: ../../backup/20150819-054002.tar.gz: Cannot write: Broken pipe
tar: Error is not recoverable: exiting now
Veo que la función exec en el script PHP no está bloqueando o causando un error prematuramente. Así que la sesión de PHP a la que se llama durante el trabajo de Cron se cierra antes de que finalice el comando. Esto es solo una suposición, pero puede intentar enviarlo al fondo cuando lo ejecute desde Cron.
exec("cd $this->backupTempFolderName/$id; tar -czf ../../$this->backupFolderName/$tarFileName $dbDumpFileName documents &");
Este comando debería estar bloqueando, así que esto es solo un disparo en la oscuridad.
Para escribir los errores en el registro cuando se ejecuta mediante la sustitución cron >/paht/to/application/app/logs/backup-output.log
en la línea cron por 2>&1 >/path/to/application/app/logs/backup-output.log
También verifique la ruta en la línea cron ... quizás el change-dir no esté funcionando como podría pensar. Intente imprimir getcwd()
en un registro o algo así, cuando ejecute el script php desde cron.
Edit: Me pregunto por qué esto fue votado not useful
. El interrogador mencionó que no se imprimen errores en el registro cuando el cron ejecuta la secuencia de comandos. Eso no es difícil de imaginar ya que simplemente redirige el STDOUT y no el STDERR (en el que se imprimirían los errores de php) al registro. Así que agregar 2>&1
podría revelar algunas nuevas informaciones.
Supongo que tiene una limitación de recursos Como lo ha dicho M. Ivanov, agregue este comando en su script PHP:
shell_exec("php -info");
y verifique este parámetro cuando ejecute su script desde la línea de comandos y desde el trabajo cron
memory_limit => ???
También puede intentar ejecutar su cron mejorando el límite de memoria a 1600M
php -d memory_limit=1600M scriptCompressor.php
Espero que ayude :)