Sostituisci il file con hard link a / dev / null


32

Sto eseguendo un'applicazione che scrive su log.txt. L'app è stata aggiornata a una nuova versione, rendendo i plug-in supportati non più compatibili. Forza una quantità enorme di errori in log.txt e non sembra supportare la scrittura in un file di registro diverso.

Come posso scriverli in un altro registro?

Ho preso in considerazione la sostituzione di log.txt con un collegamento reale (l'applicazione non può dire la differenza, giusto?) O un collegamento reale che punta a / dev / null. Quali sono le mie opzioni?


Non si può semplicemente chmod -w log.txt?
user168715

Risposte:


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

Questo copia il tuo dispositivo null con i giusti numeri di sviluppo maggiori e minori in log.txtmodo da avere un altro null.

I dispositivi non sono noti per nome nel kernel, ma piuttosto per i loro numeri maggiori e minori. Dal momento che non so quale SO hai, ho trovato conveniente copiare i numeri da dove già sappiamo che sono. Se lo fai con i numeri maggiori e minori sbagliati, molto probabilmente avresti creato un altro dispositivo, forse un disco o qualcos'altro su cui non vuoi scrivere.


4
Vale la pena notare che questo comando richiede sudo(o in esecuzione come utente root). Spiega (nella tua risposta) cosa intendi per "i numeri di sviluppo maggiori e minori giusti".
mklement0

3
(Non sono l'OP.) Apprezzo l'aggiornamento, ma sono ancora confuso su come "numeri maggiori e minori" si collegano al percorso del file /dev/null, come usato nel tuo comando. E penso che aiuterebbe i futuri lettori a notare nella tua risposta che sudoè richiesta.
mklement0

1
@wallyk: Grazie, è davvero bello saperlo. Ma il mio punto è: come entra in gioco rispetto cp -a /dev/null log.txte i miei commenti?
mklement0

1
@MALON: In effetti hai fatto, e su Ubuntu 14.04 si non è necessario sudoeseguire questo comando, a meno che non vi capita di essere in esecuzione come utente root(che è generalmente sconsigliato). L'utilizzo sudo(o l'esecuzione come root) per creare un collegamento reale (questa risposta) o un collegamento simbolico (la risposta di @ V.Michel) potrebbe essere la soluzione giusta dopo tutto, se il file deve essere collocato in una posizione in cui qualsiasi account utente può scrivere, ma il punto è: annotare esplicitamente tale requisito.
mklement0

1
PS: So che i commenti minori, maggiori, probabilmente si riferiscono a un commento sulla domanda che consiglia l'uso mknod. Nota che i commenti generalmente ricevono poca attenzione, quindi qualcuno che legge solo la domanda e quindi la tua risposta potrebbe essere confuso (come lo sono stato io; nota anche che la maggior parte delle persone non è mai esposta a concetti come numeri di dispositivo maggiori e minori).
mklement0

65

È possibile creare un collegamento simbolico a / dev / null e non è necessario essere root:

ln -s /dev/null log.txt

Questo ha anche il vantaggio di essere auto-documentato, in quanto ls -l log.txtdimostrerebbe che si tratta di un link simbolico a / dev / null, piuttosto che fare affidamento sul sapere che, ad esempio, "1, 3" è in qualche modo significativo.
Monty Harder,

14

Le altre risposte qui probabilmente funzioneranno. In particolare, la soluzione symlink sarà probabilmente la soluzione più semplice. Lo offro principalmente per completezza.

Le soluzioni che coinvolgono mknod(o cp -a) diventano problematiche se il filesystem contenente il file non supporta i dispositivi (ad esempio, è stato montato con l' nodevopzione, ad esempio). E, naturalmente, i collegamenti reali tra i filesystem semplicemente non funzioneranno.

Un'alternativa ai collegamenti fisici o alla creazione di nuovi nodi di dispositivi consiste nell'utilizzare i mount bind, che consentono di montare un file o una directory da una parte dell'albero del filesystem a un'altra. Quindi, ad esempio, puoi eseguire:

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

Funziona in modo molto simile a un collegamento reale, ma:

  • Può operare su filesystem (perché non si basa su inode di filesystem come un hard link)
  • Funziona su filesystem di sola lettura (perché non stai modificando il filesystem)

Per un esempio completo:

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

Ma funziona solo su sistemi che hanno un bind mount. (Come Linux moderno.)
reinierpost il

Un file di registro non appartiene comunque a un file system di sola lettura.
Monty Harder,

1
Sareste sorpresi di quanto spesso vi ritroviate a voler scrivere su un singolo file su un filesystem di sola lettura. E potrebbe benissimo essere su un nodevfilesystem.
Larsks,

6

Dipende in modo critico da COME l'applicazione gestisce log.txt.

Se l'applicazione apre semplicemente il file esistente e lo scrive, come descritto in altre risposte, puoi collegarlo a / dev / null, collegarlo da qualche altra parte, collegarlo da qualche altra parte (anche se i collegamenti fisici non possono essere incrociati tra i file system, quindi non c'è ' t molto utile in questo) creare una copia del nodo del dispositivo / dev / null lì ecc.

OTOH se l'applicazione elimina e ricrea log.txt nulla di tutto ciò funzionerà. Potresti collegare simbolicamente l'intera directory da qualche altra parte per reindirizzare le scritture su un diverso filesystem ma questo è tutto e dovresti occuparti di altre cose nella directory.

Immagino che se davvero volessi, potresti creare un filesystem overlay personalizzato che ha superato la maggior parte delle operazioni, eliminando ogni tentativo di creare un file chiamato log.txt.


chattr +i log.txtla prima volta e l'applicazione non cancellerà più il file.
Marco Marsala,

3

Bene, un metodo ingrato con la pipa denominata :

# 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

puoi quasi fare qualsiasi cosa con il registro scaricato, come filtro o invia su nc .


Se il catprocesso viene interrotto o arrestato in modo anomalo, il programma di accesso si bloccherà quando la pipe è piena.
Marco Marsala,

-1

Valuta di rendere il file un dispositivo null effettivo. Un file "log.txt" creato con mknod, con il giusto tipo di file e gli stessi numeri minori e maggiori, fungerà da dispositivo nullo perché lo è.


Questo non aggiunge nulla a ciò che altri hanno già detto.
Kusalananda
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.