Chtel bych se s vami podelit o ponekud neprijemna zjisteni a jak jsem
se s nimi vyrovnal. :-)
Mel jsem nejaky ten rok zato, ze prikaz
lsof +L1
vypise vsechny soubory, ktere jsou na UNIX/Linuxovem systemu smazane,
ale stale zustavaji otevrene. Ke skutecnemu uvolneni diskovych bloku po
poslednim unlinku dochazi az po zavreni souboru. Proces muze pouzivat smazanou
verzi souboru jak dlouho chce. Pomoci symlinku v /proc/PID/fd se jde k obsahu
smazaneho, ale neuvolneneho souboru dostat. Po zavreni toho handlu uz tezko...
Nedavno jsem prekvapene zjistil, ze lsof klame telem... Jeste totiz muzou byt
soubory otevrene mapovanim. A ty jsou mnohem zaludnejsi, protoze se tak
"oteviraji" sdilene knihovny, ktere mohou zustat stare i po bezpecnostnich
aktualizacich systemu, pokud se pouzivajici procesy nerestartuji!
lsof je vypisuje take, ale jinak: Ve sloupci FD je, jak zjistuju, slovo DEL.
Nebo je mozne porovnat cislo ve sloupci NODE s i-nodem aktualniho souboru
v te ceste. Dalsi moznosti je pouzit tento prikaz:
egrep -l '\(deleted\)$' /proc/*/maps | tr -cd 0-9\\n | xargs -r ps uw
Ten pekne vypise vsechny procesy s mapovanymi zastaralymi soubory. Vsimnete si
tez hezkeho triku s tr. Pro standardne otevrene soubory lze pouzit toto:
find -L /proc/[0-9]*/fd -maxdepth 1 -links -1 -printf "%h\n" 2>/dev/null \
| tr -cd 0-9\\n | xargs -r ps uw
Zkombinovani obou kolon do jedne ponechme jako domaci cviceni. :-)
Sam vsak pouzivam v cronu toto:
lsof | egrep ' DEL |\(deleted\)$' \
| egrep -v -f /etc/allowed_deleted_but_used_files \
| sed -e 's/^/DELETED-USED-FILE: /'
V souboru /etc/allowed_deleted_but_used_files mam vzorky toho, o cem nechci
byt informovan. Varovani: Tento soubor regularnich vyrazu nesmi obsahovat
prazdny radek! Pro INSPIRACI nektere vzorky (ale radeji si vytvorte svuj
soubor):
^apache2 .* /var/run/apache2/(ssl_mutex|wsgi\.[0-9.]+\.lock) \(deleted\)$
^mysqld .* /var/tmp/ib...... \(deleted\)$
^imap .* /var/home/[^ ]+/dovecot(\.index|-uidlist) \(deleted\)$
^(apache2|sshd) .* /dev/zero$
/SYSV[0-9a-f]{8}$
^(cron|sh|run-parts|curl|sh|gpg) .* (/var)?/tmp/tmpf...... \(deleted\)$
Muzete pouzit prepinac lsof -s pro vypsani sloupce s velikosti smazaneho
souboru. Pokud pouzivate Linuxovou verzi lsof, optimalizujte jeho beh
vynechanim sitovych spojeni (-X). Prepinac -R pro vypis PID rodicovskych
procesu se taky muze hodit.
Dosti se to hodilo dnes. Na stale podporovanem Debianu Squeeze LTS jsem
nainstalovalaktualizace:
[UPGRADE] libgssapi-krb5-2 1.8.3+dfsg-4squeeze8 -> 1.8.3+dfsg-4squeeze9
[UPGRADE] libgssrpc4 1.8.3+dfsg-4squeeze8 -> 1.8.3+dfsg-4squeeze9
[UPGRADE] libk5crypto3 1.8.3+dfsg-4squeeze8 -> 1.8.3+dfsg-4squeeze9
[UPGRADE] libkadm5clnt-mit7 1.8.3+dfsg-4squeeze8 -> 1.8.3+dfsg-4squeeze9
[UPGRADE] libkadm5srv-mit7 1.8.3+dfsg-4squeeze8 -> 1.8.3+dfsg-4squeeze9
[UPGRADE] libkdb5-4 1.8.3+dfsg-4squeeze8 -> 1.8.3+dfsg-4squeeze9
[UPGRADE] libkrb5-3 1.8.3+dfsg-4squeeze8 -> 1.8.3+dfsg-4squeeze9
[UPGRADE] libkrb5support0 1.8.3+dfsg-4squeeze8 -> 1.8.3+dfsg-4squeeze9
Mel jsem zato, ze aktualizacni proces restartuje procesy, ktere .so knihovny
pouzivaji. Drive se to tak delavalo. Ale dnes tomu tedy tak nebylo... apache2,
sshd, dovecot, kvm, ... vsechny takoveto nevinne procesy i po security
aktualizaci (urgency=high) stale pouzivaly stare verze...
---
Tez jsem nasel, ze v Debianu/Ubuntu je balik debian-goodies, ktery mj.
obsahuje skript checkrestart. Na Fedore je podobny: needs-restarting. Detekuje
prave procesy se startymi knihovnami a pise doporuceni, co delat. Pridam si ho
nyni to postupu updatovani baliku na svych serverech, abych se mi jeho cenne
informace aktivne cpaly.
Mimochodem, zajimavost: lsof -P je sikovny prepinac pro vypis sitovych spojeni
(-i). Dlouho jsem ho chtel: Vypne preklad cisel portu na nazvy, lepe se v tom
pak hleda. Prepinac -n snad zna kazdy casty uzivatel lsof ci netstatu.
A posledni zajimavost, vedeli jste, ze uz par let existuje protokol c. 136
s nazvem UDPLITE? :-)
Dekuji za pozornost, snad vam to k necemu bude.
Uvitam prispevky k tomuto tematu. :-)
Tuttle
|