2008-10-01 9 views
8

Cron Installation ist vixie-cronBash-Skript läuft von Shell, aber nicht von cron-Job

/etc/cron.daily/rmspam.cron

#!/bin/bash 
/usr/bin/rm /home/user/Maildir/.SPAM/cur/*; 

Ich habe diesen einfachen Bash-Skript, das ich einen cron-Job hinzufügen möchte (enthält auch Spam Lernbefehle vorher), aber dieser Teil schlägt immer mit "Datei oder Verzeichnis nicht gefunden" fehl. Aus meiner Sicht wird der Metachar nicht korrekt interperted, wenn er als Cron-Job ausgeführt wird. Wenn ich das Skript über die Befehlszeile ausführe, funktioniert es einwandfrei.

würde ich gerne, warum dies nicht funktioniert und natürlich eine funktionierende Lösung :)

Dank

bearbeiten # 1 zurück auf diese Frage kam, als ich für sie beliebte Frage Abzeichen. Ich zum ersten Mal das tat,

#!/bin/bash 
find /home/user/Maildir/.SPAM/cur/ -t file | xargs rm 

und erst vor kurzem durch die xargs Manpage liest und veränderte es zu dieser

#!/bin/bash 
find /home/user/Maildir/.SPAM/cur/ -t file | xargs --no-run-if-empty rm 

kurzen xargs Option ist -r

+0

Bitte bearbeiten und fügen Sie die Zeile aus Ihrer Crontab. –

+0

Er erwähnte in einem Kommentar, dass es in /etc/cron.daily –

Antwort

14

Wenn sich im Verzeichnis keine Dateien befinden, wird das Platzhalterzeichen nicht erweitert und direkt an den Befehl übergeben. Es gibt keine Datei namens "*", und der Befehl schlägt fehl mit "Datei oder Verzeichnis nicht gefunden". Versuchen Sie dies stattdessen:

if [ -f /home/user/Maildir/.SPAM/cur/* ]; then 
    rm /home/user/Maildir/.SPAM/cur/* 
fi 

Oder verwenden Sie einfach das Flag "-f" zu rm. Das andere Problem mit diesem Befehl tritt auf, wenn zu viel Spam für die maximale Länge der Befehlszeile vorhanden ist. So etwas ist wahrscheinlich besser Gesamt:

find /home/user/Maildir/.SPAM/cur -type f -exec rm '{}' + 

Wenn Sie ein altes haben feststellen, dass nur execs eine Datei zu einem Zeitpunkt rm:

find /home/user/Maildir/.SPAM/cur -type f | xargs rm 

, dass zu viele Dateien sowie keine Dateien verarbeitet. Danke an Charles Duffy, dass er auf die + Option zu -exec beim Finden hingewiesen hat.

+0

Eigentlich brauchst du keine Xargs mit einem neuen genug find: find /home/user/Maildir/.SPAM/cur-type f -exec rm - f '{}' '+' –

+0

sollte der Fund nicht mit einem \ enden; ? – hop

+0

Das Löschen von Dateien ist eine so häufige Aufgabe, dass "find" auch die Aktion "-delete" unterstützt. Keine ausdrückliche Notwendigkeit, '-exec rm '{}'' zu machen. – ulidtko

0

Sind Sie den vollständigen Pfad angeben zum Skript im Cronjob?

00 3 * * * /home/me/myscript.sh 

statt

00 3 * * * myscript.sh 

Auf einer anderen Anmerkung, ist es /bin/rm auf alle der Linux-Boxen ich Zugriff haben. Haben Sie überprüft, dass es wirklich /usr/bin/rm auf Ihrem Rechner ist?

+0

das Skript befindet sich in /etc/cron.daily/, die Adresse in/etc/crontab – Tanj

+0

Hmmm ist. Das ist sehr merkwürdig. –

+0

Dies ist die Standardmethode, mit der vixie-cron auf einer Gentoo-Distribution eingerichtet wird. ya es ist/bin/rm obwohl es einen Link zu/usr/bin/rm gibt. Vielleicht benutze ich nächstes Mal den rm, um den Pfad zu finden, statt zu raten. – Tanj

0

Versuchen Sie,

[email protected] 

an der Spitze Ihrer cron-Datei und Sie sollten alle Eingabe/Fehler per Post an Sie bekommen.

Sehen Sie sich auch den Befehl als cronjob Zugabe

0 30 * * * /usr/bin/rm /home/user/Maildir/.SPAM/cur/* 
0

Versuchen Sie, eine Kraft-Option und vergessen Sie einen Pfad zu rm Befehl hinzufügen. Ich denke, es sollte nicht nötig sein ...

rm -f 

Dadurch wird sichergestellt, dass selbst wenn es keine Dateien im Verzeichnis sind, rm Befehl nicht fehlschlagen. Wenn dies ein Teil eines Shell-Skripts ist, sollte das * funktionieren. Es sieht für mich aus, dass Sie ein leeres Verzeichnis haben könnten ...

Ich verstehe, dass der Rest des Skripts ausgeführt wird, oder?

0

Ist rm wirklich in /usr/bin/ auf Ihrem System? Ich habe immer gedacht, dass rm in /bin/ residieren sollte.