Cree archivos zip en /var/www/html usando crontabs

Cree archivos zip en /var/www/html usando crontabs

Como explica el título, necesitaría tomar un archivo y guardarlo en un archivo zip una vez al día; Además, el archivo zip debe moverse a /var/www/html, donde los scripts .php permiten a los usuarios descargarlo.

Suponiendo esto:

  • la ruta absoluta del archivo es/home/myuser/working-directory/file.txt
  • Puse todos los archivos de scripts que necesito ejecutar usando cronjobs en/usr/scripts
  • Programé el siguiente cronjob usando sudo crontab -e, en lugar de crontab -eporque /var/www/html necesita privilegios administrativos

Los resultados de mis pensamientos son los siguientes:

create-zip.sh

#!/bin/bash

cp /home/myuser/myworkingdir/file.txt /home/myuser/file.txt && cd /home/myuser && zip my-zip-file-$(date "+%b_%d_%Y_%H.%M.%S").zip file.txt && rm file.txt && rm /var/www/html/my-zip-file*.zip && mv my-zip-file*.zip /var/www/html && cd

sudo crontab -e

@daily sh /usr/scripts/create-zip.sh

Bueno... no funciona. Creo que el problema es algo relacionado con los privilegios porque me copian file.txty /home/myusertambién se crea el zip. Pero luego no puedo mover el zip a /var/www/html, incluso si el crontab se ejecuta con privilegios de raíz.

¿Alguna idea?

Además... dado que un .zip se crea una vez al día, necesitaría eliminar el .zip anterior de /var/www/html antes de mover el nuevo allí. Intenté usar

rm /var/www/html my-zip-file-*.zip

(verifique create-zip.sh arriba) pero tampoco funciona... así que supongo que hay algún problema con los privilegios. /var/www/html está en el grupo www-data y su propietario también es www-data.

Respuesta1

Unir comandos con &&significa que el comando de la derecha solo se ejecutará si el de la izquierda tuvo éxito. Esto significa que su crontab fallará la primera vez que se ejecute ya que no hay un archivo zip, por /var/www/html/lo que rm /var/www/html/my-zip-file*.zipfalla y mvno se ejecutará.

Por lo tanto, puede crear un archivo con el nombre correcto que pueda eliminarse y mantener el mismo comando cron:

touch /var/www/html/my-zip-file.zip

O puedes usar ;en lugar de &&:

cp /home/myuser/myworkingdir/file.txt /home/myuser/file.txt && 
cd /home/myuser && 
zip my-zip-file-$(date "+%b_%d_%Y_%H.%M.%S").zip file.txt && 
rm file.txt && 
rm /var/www/html/my-zip-file*.zip ; 
mv my-zip-file*.zip /var/www/html && cd

También estás haciendo que este camino sea más complejo de lo necesario. Copiar /home/myuser/myworkingdir/file.txtto /home/myuser/file.txtes innecesario ya que solo lo usa para comprimirlo y luego lo elimina. Los cdcomandos no son necesarios, puede utilizar la ruta completa. cdAl final tampoco hay motivo para hacerlo . Todo lo que necesita es un comando para eliminar los archivos zip del directorio de destino y un comando para comprimirlos:

rm /var/www/html/my-zip-file*.zip &&
 zip /var/www/htmlmy-zip-file-$(date "+%b_%d_%Y_%H.%M.%S").zip /home/myuser/myworkingdir/file.txt

información relacionada