BITTE BEACHTEN SIE : Ich habe alle ähnlichen Fragen bezüglich gelesen. cron, Pfade, env-Variablen usw., aber keine gefunden, die Lösungen für mein spezielles Problem bieten.
Ich habe ein Skript, das einige MySQL-Dumps erstellt und dann alte wie folgt löscht:
/usr/bin/find "/home/bkp/dbdump" -name "*.gz" -mtime +5 -delete
(Der obige Befehl wurde von meinem ursprünglichen Befehl durch Vorschläge aus Kommentaren geändert. )
Die Dateien werden jedoch niemals gelöscht, wenn cron dieses Skript ausführt. Der Cron-Benutzer ist root.
Debuggen von Notizen
Wenn ich das Skript, in dem der Befehl angezeigt wird, manuell ausführe, werden sie wie erwartet gelöscht.
Wenn ich den obigen Befehl find alleine über die Befehlszeile als root ausführe, werden sie wie erwartet gelöscht (und mit -print wird erwartungsgemäß eine Liste von Dateien zurückgegeben, die älter als 5 Tage sind).
Ich habe auch eine explizite Pfadanweisung zu Roots Crontab hinzugefügt, aber
das ändert nichts.Cron sendet keinen Fehler, und wenn ich die Suchoperation an eine Protokolldatei weitergebe, wird
diese leer oder überhaupt nicht erstellt.Ich benutze Ubuntu Server 14.04.03 LTS.
/usr/bin/find /home/bkp/dbdump/*.gz -mtime +5
cron
Befehle werden durch die Shell ausgeführt, und die Shell erweitert Platzhalter.cron
sollte E-Mails mit Ausgabe- und Fehlermeldungen senden. Erhalten Sie eine solche E-Mail von diesem Job?Antworten:
Das Problem ist, dass
crontab
nicht$PATH
festgelegt, wann es ausgeführt wird. Sie können ihm tatsächlich einen Pfad zuweisen, indem Sie diesen am Anfang der geöffneten Datei hinzufügen übercrontab -e
:(oder was auch immer
PATH
Sie bevorzugen zu verwenden). Dies bedeutet, dass Sie vermeiden können, die vollständigen Pfade zu Befehlen direkt von cron aus anzugeben.Es gibt mehrere Probleme mit Ihrem ursprünglichen Befehl. Sie fordern die Shell grundsätzlich auf, die Platzhaltererweiterung durchzuführen, anstatt
find
. Zweitens bieten Sie keinen vollständigen Pfad fürrm
; Verwenden Sie/bin/rm
oder/usr/bin/rm
, wo immer es sich auf Ihrem System befindet (siehewhich rm
).Das erste Argument für find ist der "zu suchende Ort", und dann geben Sie die "Suchabfrage" mit den verschiedenen
-<option>
s an. Das richtige Format für den Befehl, den Sie ausführen möchten, lautet also:oder
Wenn Sie die
PATH
Definition nicht wie oben angeben , verwenden Sie:oder
quelle
$PATH
eingestellt sein, aber es wird die Standardeinstellung des Systems sein. Dies schließt/usr/bin
und ein/bin
, damit derrm
Befehl gefunden werden kann.Versuchen Sie dies stattdessen
quelle
-maxdepth 1
.Wenn ich den Befehl find direkt von der crontab-Datei von root aus und nicht als Teil des Skripts aufrufe, funktioniert er.
Das betreffende Skript verwendet csh. Ich glaube, dass die Cron-Umgebung von root unter Ubuntu / bin / bash (oder / bin / dash?) Verwendet. Vielleicht widerspricht dies in irgendeiner Weise der Ausführung des Befehls find.
In jedem Fall löste sich das Hauptproblem, wenn auch etwas unelegant.
quelle