web-dev-qa-db-fra.com

Créer des fichiers Zip dans / var / www / html à l'aide de crontabs

Comme le titre l'indique, je devrais prendre un fichier et le placer dans une archive Zip une fois par jour. De plus, le fichier Zip doit être déplacé dans/var/www/html, où des scripts .php permettent aux utilisateurs de le télécharger.

En supposant que:

  • le chemin absolu du fichier est /home/myuser/working-directory/file.txt
  • Je mets tous les fichiers de script que j'ai besoin d'exécuter à l'aide de cronjobs dans /usr/scripts
  • J'ai programmé le travail suivant en utilisant Sudo crontab -e au lieu de crontab -e car/var/www/html nécessite des privilèges d'administrateur.

Les résultats de mes pensées sont les suivants:

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

Eh bien… ça ne marche pas. Je pense que le problème est lié à des privilèges, car je reçois file.txt copié dans /home/myuser, et le fichier Zip est également créé. Mais ensuite, je ne peux pas déplacer le fichier Zip vers /var/www/html, même si la crontab est exécutée sous les privilèges Root.

Une idée?

De plus, puisqu'un fichier .zip est créé une fois par jour, je devrais supprimer le fichier .zip précédent de/var/www/html avant de déplacer le nouveau. J'ai essayé d'utiliser

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

(consultez la section create-Zip.sh ci-dessus) mais cela ne fonctionne pas trop .. donc je suppose que c'est un problème avec les privilèges./var/www/html appartient au groupe www-data et son propriétaire est également www-data.

3
sciakysystem

La jonction de commandes avec && signifie que la commande de droite ne sera exécutée que si celle de gauche a réussi. Cela signifie que votre crontab échouera lors de sa première exécution car il n'y a pas de fichier Zip dans /var/www/html/, donc le rm /var/www/html/my-Zip-file*.Zip échoue et le mv ne sera pas exécuté.

Donc, vous pouvez soit créer un fichier du nom correct qui peut être supprimé et conserver la même commande cron:

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

Ou, vous pouvez utiliser ; au lieu 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

Vous rendez également cette voie plus complexe que nécessaire. La copie de /home/myuser/myworkingdir/file.txt vers /home/myuser/file.txt n'est pas nécessaire, car vous ne l'utilisez que pour le compresser et le supprimez. Les commandes cd ne sont pas nécessaires, vous pouvez utiliser le chemin complet. Il n'y a pas non plus de raison de cd à la fin. Tout ce dont vous avez besoin est une commande pour supprimer tous les fichiers Zip du répertoire cible et une commande pour les compresser:

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
2
terdon