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
- Přesuňte soubor pod jiný název, např.
mv foo.log foo.log.old
- Instruujte proces, aby znovu otevřel svůj soubor protokolu. Pokud to proces nemá žádný způsob, restartujte jej.
- 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