Remplacer le fichier par un lien dur vers / dev / null

32

J'exécute une application qui écrit dans log.txt. L'application a été mise à jour vers une nouvelle version, ce qui rend les plug-ins pris en charge plus compatibles. Il force une énorme quantité d'erreurs dans log.txt et ne semble pas prendre en charge l'écriture dans un fichier journal différent.

Comment puis-je les écrire dans un autre journal?

J'ai envisagé de remplacer log.txt par un lien dur (l'application ne peut pas faire la différence, n'est-ce pas?) Ou un lien dur qui pointe vers / dev / null. Quelles sont mes options?

MALON
la source
Tu ne peux pas juste chmod -w log.txt?
user168715

Réponses:

30
# cp -a /dev/null log.txt

Cela copie votre appareil nul avec les bons numéros de développement majeurs et mineurs afin log.txtque vous en ayez un autre null.

Les périphériques ne sont pas du tout connus par leur nom dans le noyau, mais plutôt par leur nombre majeur et mineur. Étant donné que je ne sais pas quel système d'exploitation vous avez, j'ai trouvé pratique de simplement copier les numéros d'où nous savons déjà qu'ils sont. Si vous le faites avec les mauvais nombres majeurs et mineurs, vous auriez probablement créé un autre périphérique, peut-être un disque ou autre chose sur lequel vous ne voulez pas écrire.

Josué
la source
4
Il convient de noter que cette commande nécessite sudo(ou s'exécute en tant qu'utilisateur root). Veuillez expliquer (dans votre réponse) ce que vous entendez par "les bons nombres de développeurs majeurs et mineurs".
mklement0
3
(Je ne suis pas l'OP.) J'apprécie la mise à jour, mais je suis toujours confus quant à la façon dont les "nombres majeurs et mineurs" sont liés au chemin du fichier /dev/null, tel qu'il est utilisé dans votre commande. Et, je pense que cela aiderait les futurs lecteurs à noter dans votre réponse ce qui sudoest nécessaire.
mklement0
1
@wallyk: Merci, c'est vraiment bon à savoir. Mais mon point est le suivant: comment entre en jeu par rapport à cp -a /dev/null log.txtmes commentaires?
mklement0
1
@MALON: En effet , vous avez fait, et sur Ubuntu 14.04 vous ne besoin sudod'effectuer cette commande, à moins que vous arrive d'être en cours d' exécution en tant qu'utilisateur root( ce qui est généralement déconseillée). Utiliser sudo(ou exécuter en tant que root) pour créer un lien dur (cette réponse) ou un lien symbolique (la réponse de @ V.Michel) peut être la bonne solution après tout, si le fichier doit être placé dans un emplacement où n'importe quel compte d'utilisateur peut écrire, mais le point est: notez cette exigence explicitement.
mklement0
1
PS: Je sais que les commentaires majeurs et mineurs se rapportent probablement à un commentaire sur la question recommandant l'utilisation de mknod. Notez que les commentaires reçoivent généralement peu d'attention, donc quelqu'un qui ne lit que la question et votre réponse peut être confus (comme moi; notez également que la plupart des gens ne sont jamais exposés à des concepts tels que les numéros de périphérique majeurs et mineurs).
mklement0
65

Vous pouvez créer un lien symbolique vers / dev / null et vous n'avez pas besoin d'être root:

ln -s /dev/null log.txt
V. Michel
la source
Cela a également l'avantage d'être auto-documenté, car ls -l log.txtcela montrerait qu'il s'agit d'un lien symbolique vers / dev / null, plutôt que de se fier à savoir que, par exemple, "1, 3" est en quelque sorte significatif.
Monty Harder
14

Les autres réponses ici fonctionneront probablement. En particulier, la solution de lien symbolique sera probablement la solution la plus simple. J'offre cela principalement pour être complet.

Les solutions impliquant mknod(ou cp -a) deviennent problématiques si le système de fichiers contenant le fichier ne prend pas en charge les périphériques (par exemple, il a été monté avec l' nodevoption, par exemple). Et bien sûr, les liens durs entre les systèmes de fichiers ne fonctionneront tout simplement pas.

Une alternative aux liens durs ou à la création de nouveaux nœuds de périphériques consiste à utiliser des montures de liaison, qui vous permettent de monter un fichier ou un répertoire d'une partie de votre arborescence de systèmes de fichiers sur une autre. Ainsi, par exemple, vous pouvez exécuter:

mount -o bind /dev/null /path/to/log.txt

Cela ressemble beaucoup à un lien dur, mais:

  • Il peut fonctionner sur plusieurs systèmes de fichiers (car il n'est pas basé sur des inodes de système de fichiers comme un lien dur)
  • Il fonctionne sur les systèmes de fichiers en lecture seule (car vous ne modifiez pas réellement le système de fichiers)

Pour un exemple complet:

bash-4.3# ls -l /var/log/boot.log
-rw-r--r--. 1 root root 7436 Dec 19 10:00 /var/log/boot.log
bash-4.3# mount -o bind /dev/null /var/log/boot.log
bash-4.3# ls -l /var/log/boot.log
crw-rw-rw-. 1 root root 1, 3 Dec 19 09:58 /var/log/boot.log
bash-4.3# echo words words words > /var/log/boot.log
bash-4.3# ls -l /var/log/boot.log
crw-rw-rw-. 1 root root 1, 3 Dec 19 09:58 /var/log/boot.log
alsacs
la source
Mais cela ne fonctionne que sur les systèmes qui ont un montage de liaison. (Tel que Linux moderne.)
reinierpost
De toute façon, un fichier journal n'appartiendrait pas à un système de fichiers en lecture seule.
Monty Harder
1
Vous seriez surpris de voir combien de fois vous vous retrouvez à vouloir écrire dans un seul fichier sur un système de fichiers en lecture seule. Et cela peut très bien être sur un nodevsystème de fichiers.
larsks
6

Cela dépend de façon critique de la façon dont l'application gère log.txt.

Si l'application ouvre simplement le fichier existant et y écrit, comme décrit dans d'autres réponses, vous pouvez le lier symboliquement à / dev / null, le lier ailleurs, le lier ailleurs (bien que les liens ne puissent pas être un système de fichiers croisé, il n'y a donc pas de ' t beaucoup de point dans cela) créer une copie du nœud de périphérique / dev / null là etc.

OTOH si l'application supprime et recrée log.txt, rien de tout cela ne fonctionnera. Vous pouvez créer un lien symbolique vers le répertoire entier ailleurs pour rediriger les écritures vers un système de fichiers différent, mais c'est à ce sujet et vous devrez traiter d'autres choses dans le répertoire.

Je suppose que si vous le vouliez vraiment, vous pourriez créer un système de fichiers de superposition personnalisé qui a passé la plupart des opérations tout en rejetant toutes les tentatives de création d'un fichier appelé log.txt.

plugwash
la source
chattr +i log.txtla première fois et l'application ne supprimera plus le fichier.
Marco Marsala
3

Eh bien, une méthode ingrate avec un tube nommé:

# create a named pipe
mkfifo /path/to/log.txt
# read contents from the pipe and redirect them to /dev/null
cat /path/to/log.txt > /dev/null

vous pouvez presque tout faire avec le journal sauvegardé, comme filtrer ou envoyer via nc .

user3824053
la source
Si le catprocessus est tué ou plante, le programme de connexion se bloque lorsque le tuyau est plein.
Marco Marsala
-1

Envisagez de faire du fichier un périphérique nul réel. Un fichier "log.txt" créé avec mknod, avec le bon type de fichier et les mêmes nombres mineurs et majeurs, agira comme un périphérique nul car il l'est.

rackandboneman
la source
Cela n'ajoute rien à ce que d'autres ont déjà dit.
Kusalananda