2008-10-01 14 views
8

l'installation Cron est vixie-Cronscript bash va de shell, mais pas de tâche cron

/etc/cron.daily/rmspam.cron

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

Je possède ce script bash simple que je veux ajouter à une tâche cron (comprend également le spam apprendre les commandes avant) mais cette partie échoue toujours avec "Fichier ou répertoire non trouvé" D'après ce que je me dis, le métachar n'est pas correctement interprété lorsqu'il est exécuté comme un travail cron. Si j'exécute le script à partir de la ligne de commande, cela fonctionne très bien.

Je voudrais un pourquoi pour cela ne fonctionne pas et bien sûr une solution de travail :)

Merci

modifier # 1 est revenu à cette question quand je suis arrivé badge question populaire pour elle. J'ai d'abord fait cela,

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

et tout récemment a été la lecture à travers la page de manuel xargs et changé à ce

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

courte xargs est -r

+0

Veuillez modifier et ajouter la ligne de votre crontab. –

+0

Il a mentionné dans un commentaire ci-dessous qu'il est dans /etc/cron.daily –

Répondre

14

S'il n'y a aucun fichier dans le répertoire, le caractère générique ne sera pas développé et sera directement transmis à la commande. Il n'y a pas de fichier appelé "*", puis la commande échoue avec "Fichier ou répertoire introuvable". Essayez ceci à la place:

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

Ou utilisez simplement le drapeau "-f" pour rm. L'autre problème avec cette commande est ce qui arrive quand il y a trop de spam pour la longueur maximale de la ligne de commande. Quelque chose comme ceci est probablement mieux dans l'ensemble:

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

Si vous avez un vieux trouvent que seuls execs rm un fichier à la fois:

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

qui gère trop de fichiers, ainsi que pas de fichiers. Merci à Charles Duffy pour avoir signalé l'option + de -exec dans find.

+0

En fait, vous n'avez pas besoin de xargs avec une nouvelle trouvaille: find /home/user/Maildir/.SPAM/cur -type f -exec rm - f '{}' '+' –

+0

ne devrait pas trouver la fin avec un \; ? – hop

+0

La suppression de fichiers est une tâche si fréquente que 'find' supporte aussi l'action' -delete'. Aucun besoin explicite de faire '-exec rm '{}''. – ulidtko

0

Êtes-vous indiquant le chemin complet au script dans le cronjob?

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

plutôt que

00 3 * * * myscript.sh 

Sur une autre note, il est sur /bin/rm toutes les boîtes de linux que j'ai accès. Avez-vous revérifié que c'est vraiment /usr/bin/rm sur votre machine?

+0

le script se trouve dans /etc/cron.daily/ qui est adressé dans/etc/crontab – Tanj

+0

Hmmm. C'est très étrange. –

+0

C'est par défaut que vixie-cron est installé sur une distribution gentoo. ya c'est/bin/rm bien qu'il y ait un lien vers/usr/bin/rm. Peut-être que la prochaine fois je vais utiliser quel rm pour trouver le chemin au lieu de deviner – Tanj

0

essayer d'ajouter

[email protected] 

en haut de votre fichier cron et vous devriez obtenir des entrées/erreurs envoyé par la poste.

Voir également l'ajout de la commande comme cronjob

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

Essayez d'utiliser une option de force et oublier l'ajout d'un chemin de commande rm. Je pense qu'il ne devrait pas être nécessaire ...

rm -f 

Cela garantira que même s'il n'y a pas de fichiers dans le répertoire, la commande rm ne manquera pas. Si cela fait partie d'un script shell, le * devrait fonctionner. Il me semble que vous pourriez avoir un répertoire vide ...

Je comprends que le reste du script est en cours d'exécution, non?

0

Est-ce que rm est vraiment situé dans /usr/bin/ sur votre système? J'ai toujours pensé que rm devrait résider dans /bin/.

Questions connexes