Erstellen Sie Zip-Dateien in /var/www/html mit Crontabs

Erstellen Sie Zip-Dateien in /var/www/html mit Crontabs

Wie der Titel erklärt, müsste ich einmal am Tag eine Datei nehmen und sie in ein ZIP-Archiv packen; außerdem muss die ZIP-Datei nach /var/www/html verschoben werden, wo ein PHP-Skript den Benutzern das Herunterladen ermöglicht.

Unter dieser Annahme:

  • Der absolute Pfad der Datei lautet/home/myuser/working-directory/file.txt
  • Ich habe alle Skriptdateien, die ich mit Cronjobs ausführen muss, in/usr/scripts
  • Ich habe den folgenden Cronjob mit programmiert sudo crontab -e, anstatt crontab -eweil /var/www/html Administratorrechte benötigt

Die Ergebnisse meiner Überlegungen sind folgende:

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

Nun ja, es funktioniert nicht. Ich denke, das Problem hat etwas mit den Berechtigungen zu tun, denn ich werde file.txthineinkopiert /home/myuserund die Zip-Datei wird auch erstellt. Aber dann kann ich die Zip-Datei nicht nach verschieben /var/www/html, selbst wenn die Crontab mit Root-Berechtigungen ausgeführt wird.

Irgendeine Idee?

Außerdem muss ich, da einmal am Tag eine .zip-Datei erstellt wird, die vorherige .zip-Datei aus /var/www/html entfernen, bevor ich die neue dorthin verschieben kann. Ich habe versucht,

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

(überprüfen Sie oben „create-zip.sh“), aber das funktioniert auch nicht. Ich schätze also, dass etwas mit den Berechtigungen nicht stimmt. /var/www/html gehört zur Gruppe „www-data“ und sein Besitzer ist ebenfalls „www-data“.

Antwort1

Das Verbinden von Befehlen mit &&bedeutet, dass der rechte Befehl nur ausgeführt wird, wenn der linke erfolgreich war. Das bedeutet, dass Ihre Crontab beim ersten Ausführen fehlschlägt, da keine Zip-Datei vorhanden ist. Daher schlägt /var/www/html/die rm /var/www/html/my-zip-file*.zipfehl und die mvwird nicht ausgeführt.

Sie können also entweder eine Datei mit dem richtigen Namen erstellen, die gelöscht werden kann, und denselben Cron-Befehl beibehalten:

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

Oder Sie können ;stattdessen Folgendes verwenden &&:

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

Sie machen dies auch viel komplizierter als nötig. Das Kopieren von /home/myuser/myworkingdir/file.txtnach /home/myuser/file.txtist unnötig, da Sie es nur zum Komprimieren und anschließenden Löschen verwenden. Die cdBefehle werden nicht benötigt, Sie können den vollständigen Pfad verwenden. Es gibt auch keinen Grund, dies cdam Ende zu tun. Sie benötigen lediglich einen Befehl zum Entfernen aller Zip-Dateien aus dem Zielverzeichnis und einen Befehl zum Komprimieren:

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

verwandte Informationen