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:
/home/myuser/working-directory/file.txt
/usr/scripts
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.
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