GNU/Linux >> Linux Esercitazione >  >> Linux

Come collegare un file di registro a /dev/null e ripristinare automaticamente lo spazio utilizzato?

Ho un file di registro che diventa enorme. Le informazioni che posso ottenere da esso sono trascurabili.

Voglio collegarlo a /dev/null . Tuttavia, anche se viene "cancellato" (vedi sotto l'output di lsof), consuma tutto il mio spazio sul disco rigido.

Posso troncarlo usando:

: > "/proc/$pid/fd/$fd"
# for instance:
: > "/proc/2456/fd/2"

Sfortunatamente, ci sono processi sul sistema che vengono messi in pausa quando il disco rigido è pieno e devono essere riavviati manualmente (e voglio evitare che i processi vengano messi in pausa).

C'è un modo per troncare automaticamente il file quando diventa troppo grande (ad esempio quando consuma più di 1 G?)

lsof uscita:

program  2456 user    2w   REG    8,5 441433300992     0 21365598 /home/user/file (deleted)

Risposta accettata:

Il contenuto di un file viene eliminato solo quando non vi è più alcun riferimento ad esso. Un riferimento a un file può essere una voce di directory o un handle di file aperto. Quando rimuovi un file (ad es. con rm comando) che un processo ha ancora aperto (qui, il processo che sta registrando su di esso), il contenuto del file rimane fino a quando il processo non chiude il file.

Il modo più semplice per sbarazzarsi dei vecchi log è

  1. Sposta il file su un altro nome, ad es. mv foo.log foo.log.old
  2. Chiedi al processo di riaprire il suo file di registro. Se il processo non ha modo di farlo, riavvialo.
  3. Elimina il vecchio file di registro ora chiuso (rm foo.log.old ).

Il programma logrotate automatizza questo meccanismo e può essere configurato per quanti giorni di vecchi registri tenere in giro. Può anche comprimere vecchi log.

Per il passaggio 2, se non riesci a riavviare il programma e non ha un modo per riaprire il suo file di registro, puoi provare a farlo riaprire forzatamente il file di registro con un debugger. Tuttavia, fai attenzione che ciò può causare il crash del programma se mantiene le informazioni sul file di registro che ora sono diventate incoerenti. Proof-of-concept (attenzione, molte cose possono andare storte con questo; in caso di dubbio, non farlo):

gdb -n $pid -batch -x /dev/stdin <<EOF
call close(2)
call open("/path/to/foo.log", 1)
EOF

Un metodo grezzo alternativo per liberare spazio su disco se non ti interessa nessuno dei registri è troncare il file. Il processo di registrazione continuerà a scrivere nella stessa posizione nel file, ma il file diventerà un file sparse. Se leggi il file dall'inizio, otterrai byte nulli, ma questi byte nulli occupano solo pochi kB sul disco.

dd if=/dev/null of=/path/to/foo.log

Linux
  1. In che modo Linux gestisce più separatori di percorsi consecutivi (/home////nomeutente///file)?

  2. Linux:differenza tra /dev/console , /dev/tty e /dev/tty0?

  3. Come eseguire il file sh da un altro file sh

  4. Come Linux usa /dev/tty e /dev/tty0

  5. Come posso esportare e ripristinare le impostazioni di iptables?

Differenza tra /var/log/messages, /var/log/syslog e /var/log/kern.log?

/dev/null in Linux

Come mappare il dispositivo /dev/sdX e /dev/mapper/mpathY dal dispositivo /dev/dm-Z

Comprendere i file /proc/mounts, /etc/mtab e /proc/partitions

kernel:disabilitare /dev/kmem e /dev/mem

echo o print /dev/stdin /dev/stdout /dev/stderr