quelqu'un peut-il me donner une solution pour tronquer tous les fichiers journaux dans le répertoire /var/log/
?
et une question juste pour la connaissance, est-ce une bonne idée ou pas?
#!/bin/bash
LOGDIR="/var/log"
for logfile in $(ls $LOGDIR/*log)
do
truncate -s 0 $logfile
done
essaye ça:
truncate -s 0 /var/log/*log
MODIFIER:
si vous souhaitez effectuer cette opération plusieurs fois, vous devez utiliser logrotate
pour gérer vos journaux. Habituellement, il est installé à Ubuntu. Regardez man logrotate
(ou si vous ne l'avez pas déjà installé, regardez la page de manuel en ligne ou installez-le avec Sudo apt-get install logrotate
)
depuis la page de manuel:
logrotate est conçu pour faciliter l'administration de systèmes générant un grand nombre de fichiers journaux. Il permet une rotation, une compression, une suppression et un envoi automatiques des fichiers journaux. Chaque fichier journal peut être traité quotidiennement, hebdomadairement, mensuellement ou lorsqu'il devient trop volumineux.
Si vous souhaitez effacer tous vos fichiers journaux, et pas seulement ceux du dossier journal de premier niveau, vous pouvez utiliser:
shopt -s globstar # if needed
truncate -s 0 /var/log/*.log # first-level logs
truncate -s 0 /var/log/**/*.log # nested folders, like /var/log/nginx/access.log
En notant que si vous avez déjà logrotate
en cours d'exécution, vous devez également effacer les journaux .gz
pivotés:
find /var/log -type f -name '*.[0-99].gz' -exec rm {} +
Une utilisation valide de ceci pourrait être la construction d'un conteneur d'appareils VM à des fins de distribution, par exemple.
Vous devriez pas avoir besoin de faire cela dans le cadre de la maintenance de routine: comme D-E-M l'a suggéré assez correctement, utilisez logrotate
pour cela.
En guise de suivi de @ D-E-N answer
Cela trouvera tous les fichiers journaux dans /var/log
et les tronquera à 0 octet.
find /var/log -type f -iname '*.log' -print0 | xargs -0 truncate -s0
Il est recommandé de faire pivoter les journaux dans/var/logs afin de les faire pivoter avec la fonctionnalité logrotate, mais pas à tout moment. Les journaux système seront imprimés et ils seront pratiques pour déboguer les défaillances.
Si vous ne devez pas utiliser logrotate, vous pouvez explorer des options. Bien que l'option tronquer soit une option facile dans quelques versions de système unix, cette commande n'est pas disponible facilement, elle doit être installée. Si vous n'êtes pas autorisé à installer la nouvelle commande, vous pouvez utiliser la boucle ci-dessous.
for logfile $(ls /path/*.log)
do
cat /dev/null > $logfile
done
Il existe plusieurs méthodes pour tronquer complètement un fichier, généralement applicable à la plupart des systèmes d'exploitation compatibles POSIX. Le plus souvent, vous verrez que les scripts Shell ont quelque chose comme true > file.txt
ou : > file.txt
(et dans le cas de bash
Shell, la redirection de >
suffit à elle seule). Cela est dû à la façon dont >
ouvre les fichiers via open()
ou openat()
syscall avec O_WRONLY|O_CREAT|O_TRUNC
flags - qui lit en écriture seule OR create si le nom de fichier n'existe pas, OR tronquer le nom de fichier existant.
Dans cet esprit, nous pouvons implémenter quelque chose comme ça en C nous-mêmes:
#include <stdio.h>
#include <fcntl.h>
#include <unistd.h>
int main(int argc, char **argv){
if (argc == 2){
int fd = open(argv[1],O_TRUNC);
close(fd);
}
return 0;
}
Nommez le fichier qui stocke ce code sous la forme trunc.c
et compilez-le avec gcc trunc.c -o trunc
. Vous aurez ainsi un petit utilitaire qui tronquera un argument de nom de fichier fourni comme dans trunc ./foobar.txt
. Bien sûr, ce code ne fait pas d’autres vérifications, il ne fait que tronquer le premier paramètre de position. Je laisserai aux lecteurs le soin de comprendre comment traiter plus d’un paramètre de position. Sur la note de côté, il y a truncate()
syscall que nous pourrions également utiliser, et tronquer un fichier à une longueur variable.
Maintenant, si vous n'êtes pas un fan de C, Python pourrait être plus facile pour vous. La commande open()
fonctionne sur le même principe que dans Python - ouverture du fichier pour écriture et troncation si le nom de fichier existe. Ainsi on peut faire
python -c 'import sys;open(sys.argv[1],"w").close()' passwd.copy
En ce qui concerne la recherche de tous les fichiers .log
, cela a déjà été couvert dans d'autres réponses - utilisez *
glob ou extended glob dans bash
. Il y a aussi find -type f -name "*.log"
, qui a le drapeau -exec
pour les commandes en cours (dans ce cas particulier, sh -c ''
pour tirer parti de >
car >
est un opérateur Shell et non un exécutable externe). Ainsi tu peux faire
find /var/log -type f -name "*.log" -exec sh -c 'true > "$1"' sh {} \;
Il est également intéressant de noter que les fichiers journaux du répertoire tels que /var/log
sont souvent pivotés par le service logrotate. Il existe donc des noms de fichiers tels que /var/log/service.log
, /var/log/service.log.1
, etc., de sorte que vous pouvez utiliser plutôt le modèle *.log.[1-9]
.
Entre autres choses, nous pouvons copier /dev/null
dans le fichier souhaité. Curieusement, même si /dev/null
est un type de fichier avec un caractère spécial, lorsque vous copiez ce fichier ailleurs, le résultat est un fichier normal vide, au moins avec GNU cp
. Ainsi on peut faire
cp /dev/null foo.txt
ou
dd if=/dev/null of=foo.txt
Autre lecture suggérée: