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 decrontab -e
porque /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.txt
y /home/myuser
tambié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*.zip
falla y mv
no 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.txt
to /home/myuser/file.txt
es innecesario ya que solo lo usa para comprimirlo y luego lo elimina. Los cd
comandos no son necesarios, puede utilizar la ruta completa. cd
Al 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