GNU/Linux >> Znalost Linux >  >> Linux

Jak propojit soubor protokolu s /dev/null a automaticky obnovit použitý prostor?

Mám soubor protokolu, který se zvětšuje. Informace, které z toho mohu získat, jsou zanedbatelné.

Chci to propojit s /dev/null . Nicméně, i když je „smazán“ (viz níže výstup lsof), spotřebovává veškerý můj pevný disk.

Mohu to zkrátit pomocí:

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

Bohužel jsou v systému procesy, které jsou pozastaveny, když je pevný disk plný, a musí být ručně restartovány (a já se chci vyhnout pozastavení procesů).

Existuje způsob, jak automaticky zkrátit soubor, když se stane příliš velkým (např. když spotřebuje více než 1G?)

lsof výstup:

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

Přijatá odpověď:

Obsah souboru je smazán pouze tehdy, když na něj již není žádný odkaz. Odkazem na soubor může být položka adresáře nebo popisovač otevřeného souboru. Když odstraníte soubor (např. pomocí rm příkaz), že je proces stále otevřený (zde proces, který se k němu přihlašuje), obsah souboru zůstává, dokud proces soubor nezavře.

Nejjednodušší způsob, jak se zbavit starých protokolů, je

  1. Přesuňte soubor pod jiný název, např. mv foo.log foo.log.old
  2. Instruujte proces, aby znovu otevřel svůj soubor protokolu. Pokud to proces nemá žádný způsob, restartujte jej.
  3. Smažte nyní zavřený starý soubor protokolu (rm foo.log.old ).

Program logrotate automatizuje tento mechanismus a lze jej nakonfigurovat podle toho, kolik dní starých protokolů se má uchovávat. Může také komprimovat staré protokoly.

V kroku 2, pokud nemůžete restartovat program a nemá způsob, jak znovu otevřít svůj soubor protokolu, můžete zkusit vynutit, aby znovu otevřel soubor protokolu pomocí ladicího programu. Dejte si však pozor, že to může způsobit selhání programu, pokud uchovává informace o souboru protokolu, který je nyní nekonzistentní. Proof-of-concept (pozor, s tím se může pokazit spousta věcí; pokud máte pochybnosti, prostě to nedělejte):

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

Alternativní hrubou metodou, jak uvolnit místo na disku, pokud se nestaráte o žádný z protokolů, je zkrácení souboru. Proces protokolování bude pokračovat v zápisu na stejnou pozici v souboru, ale soubor se stane řídkým souborem. Pokud čtete ze souboru od začátku, získáte null bajty, ale tyto null bajty zabírají na disku jen několik kB.

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

Linux
  1. Co jsou soubory /dev/zero a /dev/null v Linuxu

  2. Jak kódovat base64 /dev/random nebo /dev/urandom?

  3. Jak spustit soubor sh z jiného souboru sh

  1. Kdy mám použít /dev/shm/ a kdy /tmp/?

  2. Linux:Rozdíl mezi /dev/console , /dev/tty a /dev/tty0

  3. jádro:deaktivace /dev/kmem a /dev/mem

  1. Jak Linux zpracovává více po sobě jdoucích oddělovačů cest (/home////username///soubor)?

  2. Linux:Rozdíl mezi /dev/console, /dev/tty a /dev/tty0?

  3. Jak exportuji a obnovím svá nastavení iptables?