web-dev-qa-db-fra.com

Supprimer les fichiers journaux à l'aide de la tâche cron

Salut. Je souhaite supprimer tous les fichiers journaux des 7 derniers jours d'un dossier, mais laisser tous les autres fichiers. Puis-je utiliser la commande ci-dessous? Comment spécifiez-vous qu'il supprime simplement les fichiers avec l'extension .log?

 find  /path/to/file -mtime +7 -exec rm -f {} \; 

Dois-je écrire cette commande dans un fichier, ou puis-je simplement l'écrire dans l'invite de commande et l'exécuter automatiquement tous les jours?

Je n'ai aucune idée de comment exécuter un travail cron sous Linux.

14
Harry

Utilisez un caractère générique. Et mettez-le simplement dans votre crontab utilisez l'option crontab -e pour éditer vos tâches crontab.
Voir l'exemple:

  * * * * *  find  /path/to/*.log -mtime +7 -exec rm -f {} \; 

Juste pour incrémenter la réponse, consultez cet article sympa sur la façon de travailler avec votre crontab! Sous Linux.

EDIT: mise à jour de corntab vers crontab

20
Up_One

Vous modifiez votre personnel crontab en exécutant crontab -e. Cela est enregistré dans /var/spool/cron/<username>. Le fichier sera le nom d'utilisateur du propriétaire, donc root sera/var/spool/cron/root. Tout dans le fichier est exécuté en tant que propriétaire du fichier.

La syntaxe de crontab est la suivante:

Shell=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root
HOME=/

# For details see man 4 crontabs

# Example of job definition:
# .---------------- minute (0 - 59)
# |  .------------- hour (0 - 23)
# |  |  .---------- day of month (1 - 31)
# |  |  |  .------- month (1 - 12) OR jan,feb,mar,apr ...
# |  |  |  |  .---- day of week (0 - 6) (Sunday=0 or 7) OR Sun,mon,tue,wed,thu,fri,sat
# |  |  |  |  |
# *  *  *  *  * user-name command to be executed

Lorsque vous modifiez votre propre personnel crontab, via crontab -e, Vous omettez le champ du nom d'utilisateur, car l'utilisateur est déduit du nom de fichier (voir le premier paragraphe).

Cela étant dit, votre entrée devrait ressembler à ceci:

* * * * *  find  /path/to/*.log -mtime +7 -delete

Veuillez ne pas trop utiliser l'option -exec, Lorsque l'option -delete Fait exactement ce que vous voulez faire. L'exécuteur opère un Shell pour chaque fichier et est excessivement gaspilleur sur les ressources système.

Lorsque vous avez terminé, vous pouvez utiliser crontab -l Pour répertorier votre crontab personnel.

ps. L'éditeur par défaut sur la plupart des systèmes Linux est vi, si vous ne connaissez pas vi, utilisez quelque chose de simple comme nano en définissant votre variable d'environnement export EDITOR=nano

9
typedeaf
find /path/to/dir-containing-files -name '*.log' -mtime +7 -exec rm -f {} \;

Pour créer un travail cron, placez un fichier contenant les éléments suivants dans le répertoire /etc/cron.daily:

#!/bin/sh
find /path/to/dir-containing-files -name '*.log' -mtime +7 -exec rm -f {} \;
5
user3392484

Tu devrais utiliser crontab -e pour modifier votre crontab et planifier le travail. Cela pourrait ressembler à ceci:

* 1 * * * /usr/bin/find /path/to/file -name '*.log' -mtime +7 -exec rm -f {} \; 

Cela supprimera récursivement tous les fichiers .log dans le répertoire/chemin/vers/fichier tous les jours à 1h du matin.

4
Ben Whaley

Puisqu'il s'agit de fichiers journaux, vous devriez regarder logrotate. Il s'exécute quotidiennement à partir du travail cron du système et fera tourner les journaux pour vous en fonction des règles du fichier /etc/logrotate.conf, qui comprend généralement le répertoire /etc/logrotate.d. Donc pas besoin de crontab ni de find.

Vous pouvez également avoir votre propre tâche cron si vous n'avez pas accès pour ajouter un fichier à /etc/logrotate.d pour votre propre configuration.

Il existe de nombreux exemples dans /etc/logrotate.d.

Il attend de votre application qu'elle écrive dans un seul fichier. Ce n'est pas pour une application qui se connecte à un fichier journal différent chaque jour. Une application n'a généralement pas besoin de faire cela. Si l'application garde le fichier journal ouvert, logrotate peut exécuter un script postrotate pour indiquer à l'application de rouvrir le fichier journal.

2
Marko Kohtala

Après avoir fait des recherches sur ce sujet particulier, j'ai constaté que beaucoup de gens recommandent d'utiliser l'option - delete comme ceci:

* * * * *  find  /path/to/*.log -mtime +7 -delete;  

Les avantages de cette version sont qu'elle est facile à retenir et qu'elle fonctionnera mieux car - exec engendrera un nouveau processus pour chaque fichier qui doit être supprimé.

Voici quelques références: https://linuxaria.com/howto/linux-Shell-how-to-use-the-exec-option-in-find-with-examples
https://unix.stackexchange.com/questions/167823/find-exec-rm-vs-delete

0
Milan Nankov

Vous le faites de la manière DURE. Essayez d'utiliser la commande clear

* * * * 0 clear > /home/user/CronLog.txt:

où 0 est dimanche et 7 serait samedi. le ">" effacera le journal comme appose à ">>" qui s'ajoute au journal. Si votre fichier journal est root, tapez "root" avant "clear" comme ceci

* * * * 0 root clear > /home/user/CronLog.txt

0
NiteBladeX

Cela supprimera les fichiers journaux de plus de 7 jours

* * * * *  find  /path/to -name '*.log' -mtime +7 -exec rm -f {} \;

Cela supprimera les fichiers journaux de plus de 30 minutes

* * * * *  find  /path/to -name '*.log' -mmin +30 -exec rm -f {} \;
0
Atif Tariq