Réponses:
essaye ça:
truncate -s 0 /var/log/*log
ÉDITER:
si vous souhaitez effectuer cette opération plusieurs fois, vous devez utiliser logrotate
pour gérer vos journaux. Habituellement, il est installé dans ubuntu. Jetez un œil à man logrotate
(ou si vous ne l'avez pas installé, regardez la page de manuel en ligne ou installez-la avec sudo apt-get install logrotate
)
à partir de la page de manuel:
logrotate est conçu pour faciliter l'administration des systèmes qui génèrent un grand nombre de fichiers journaux. Il permet la rotation, la compression, la suppression et l'envoi automatiques des fichiers journaux. Chaque fichier journal peut être géré quotidiennement, hebdomadairement, mensuellement ou lorsqu'il devient trop volumineux.
Si vous souhaitez effacer tous vos fichiers journaux, 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
Notant que si vous avez déjà logrotate
exécuté, vous devrez également effacer les .gz
journaux tournés :
find /var/log -type f -name '*.[0-99].gz' -exec rm {} +
Une utilisation valide pour cela pourrait être la construction d'un conteneur d'appliance VM pour la distribution, par exemple.
Vous ne devriez pas avoir besoin de le faire dans le cadre de la maintenance de routine: comme DEM l'a suggéré correctement, utilisez logrotate
-le.
Comme suite à la réponse @DEN
Cela trouvera tous les fichiers journaux /var/log
et les tronquera à 0 octet.
find /var/log -type f -iname '*.log' -print0 | xargs -0 truncate -s0
*.log*
place mais je ne sais pas si c'est 100% sûr, donc je ne l'ai pas inclus dans la réponse. Parce qu'il y a des fichiers comme dovecot.log-20180930
et dovecot.log-20180923.gz
.
Il existe deux méthodes pour tronquer complètement un fichier, généralement applicables à la plupart des systèmes d'exploitation compatibles POSIX. Le plus courant que vous verrez avec les scripts shell est quelque chose comme true > file.txt
ou : > file.txt
(et dans le cas du bash
shell, la >
redirection seule est suffisante). Cela est dû à la façon dont les >
fichiers sont ouverts via open()
ou openat()
syscall avec des O_WRONLY|O_CREAT|O_TRUNC
indicateurs - qui lit en écriture seule OU crée si le nom de fichier n'existe pas, OU tronque 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 trunc.c
et compilez-le avec gcc trunc.c -o trunc
, et vous avez vous-même un petit utilitaire qui tronquera un argument de nom de fichier tel qu'il est fourni trunc ./foobar.txt
. Bien sûr, ce code ne fait pas d'autres vérifications, il tronque uniquement le premier paramètre positionnel. Je laisse aux lecteurs le soin de comprendre comment gérer plus d'un paramètre positionnel. En parallèle, il existe un truncate()
appel système que nous pourrions également utiliser et tronquer un fichier à une longueur variable.
Maintenant, si vous n'êtes pas fan de C, Python pourrait être plus facile pour vous. open()
La commande fonctionne sur le même principe en Python - ouvrir un fichier pour écrire et tronquer si un nom de fichier existe. Ainsi nous pouvons faire
python -c 'import sys;open(sys.argv[1],"w").close()' passwd.copy
Quant à trouver tous les .log
fichiers, cela a déjà été couvert dans d'autres réponses - utilisez *
glob ou glob étendu bash
. Il y a aussi find -type f -name "*.log"
, qui a -exec
drapeau pour les commandes en cours d' exécution (dans ce cas particulier sh -c ''
pour tirer parti de >
cause >
est un opérateur shell et non un exécutable externe). Ainsi vous pouvez 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 dans le répertoire tels que /var/log
souvent sont mis en rotation par le service logrotate, donc il y aura des noms de fichiers tels que /var/log/service.log
, /var/log/service.log.1
, etc., de sorte que vous pouvez utiliser *.log.[1-9]
modèle à la place
Entre autres choses, nous pouvons copier /dev/null
dans le fichier souhaité. Curieusement, même s'il /dev/null
s'agit d'un type de fichier de périphérique à caractère spécial, lorsque vous copiez cela ailleurs, le résultat est un fichier normal vide, au moins avec GNU cp
. Ainsi nous pouvons faire
cp /dev/null foo.txt
ou
dd if=/dev/null of=foo.txt
Autre lecture suggérée:
Il est recommandé de faire pivoter les journaux dans / var / logs pour effectuer une rotation avec la fonctionnalité logrotate, mais pas chaque fois que nous le souhaitons. Les journaux système lui seront imprimés et ils seront pratiques pour déboguer les éventuels échecs.
S'il est nécessaire de ne pas utiliser logrotate, des options peuvent être explorées. Bien que tronquer soit une option facile dans quelques versions du système Unix, cette commande n'est pas disponible facilement, doit être installée.Si elle n'est pas autorisée à installer la nouvelle commande, la boucle ci-dessous peut être utilisée.
for logfile $(ls /path/*.log)
do
cat /dev/null > $logfile
done
for logfile in /path/*.log
plutôt.
/var/log
c'est là que le système place les messages dont vous pourriez avoir besoin plus tard. Ubuntu a déjà rencontré le problème. Lisezman 8 logrotate;man logrotate.conf
.