VEUILLEZ NOTER : J'ai lu toutes les questions similaires concernant. cron, chemins, variables env et ainsi de suite, mais n'en ont trouvé aucune qui offre des solutions à mon problème particulier.
J'ai un script qui fait des vidages MySQL puis supprime les anciens comme ceci:
/usr/bin/find "/home/bkp/dbdump" -name "*.gz" -mtime +5 -delete
(la commande ci - dessus a été modifiée par rapport à ma commande d'origine par des suggestions de commentaires )
Cependant, les fichiers ne sont jamais supprimés lorsque cron exécute ce script. L'utilisateur cron est root.
Notes de débogage
Si j'exécute manuellement le script dans lequel la commande apparaît, il les supprime comme prévu.
Si j'exécute la commande find ci-dessus seule à partir de la ligne de commande en tant que root, elle les supprime comme prévu (et avec -print, elle renvoie une liste de fichiers de plus de 5 jours comme prévu)
J'ai également ajouté une instruction de chemin explicite à la crontab de root, mais
cela ne change rien.Cron n'envoie aucune erreur et si je redirige l'opération de recherche vers un fichier journal,
celui-ci apparaît vide ou n'est pas créé du tout.J'utilise le serveur Ubuntu 14.04.03 LTS.
/usr/bin/find /home/bkp/dbdump/*.gz -mtime +5
cron
les commandes sont exécutées via le shell, et le shell développe les caractères génériques.cron
devrait envoyer un e-mail avec des messages de sortie et d'erreur. Recevez-vous un tel e-mail de ce travail?Réponses:
Le problème est qu'il
crontab
n'a pas été$PATH
défini lors de son exécution. Vous pouvez en fait lui fournir un chemin en l'ajoutant en haut du fichier ouvert viacrontab -e
:(ou tout
PATH
ce que vous préférez utiliser). Cela signifie que vous pouvez éviter de spécifier les chemins d'accès complets aux commandes, directement à partir de cron.Il y a plusieurs problèmes avec votre commande d'origine. Vous demandez essentiellement au shell de faire l'extension générique, plutôt que
find
. Deuxièmement, vous ne fournissez pas un chemin complet pourrm
; utilisez/bin/rm
ou/usr/bin/rm
, où qu'il se trouve sur votre système (voirwhich rm
).Le premier argument pour rechercher est «l'emplacement à rechercher», puis vous spécifiez la «requête de recherche» avec les différents
-<option>
s. Ainsi, le format approprié de la commande que vous souhaitez exécuter est:ou
Si vous ne spécifiez pas la
PATH
définition comme ci-dessus, utilisez:ou
la source
$PATH
défini, mais ce sera la valeur par défaut du système. Cela inclura/usr/bin
et/bin
, donc il devrait être capable de trouver larm
commande.Essayez ceci à la place
la source
-maxdepth 1
.Si j'appelle la commande find directement à partir de la crontab de root et non dans le cadre du script, alors cela fonctionne.
Le script en question utilise csh. Je crois que l'environnement cron de root sur Ubuntu utilisera / bin / bash (ou / bin / dash?). Peut-être que cela entre en conflit avec la façon dont la commande find était en cours d'exécution.
Quoi qu'il en soit, le principal problème qu'il a résolu, quoique quelque peu inélégant.
la source