Linux – Friheden til systemadministration: Version 2.8.20060113 – 2021-01-07 | ||
---|---|---|
forrige | Kapitel 3. Filsystemer | næste |
Ofte vil dit program have filer åbne som du måske ikke lige vidste. Med lsof kan du se hvad der sker. Vi kan f.eks. se hvad programmet arbejder med. Som eksempel kan vi se hvad der sker, når man har ping kørende. Først finder vi den pid - proces-ID - som ping kører med. Der er mindst to muligheder, enten med ps aux eller pidof.
[root@linus /root]# ps aux | grep ping pto 9149 0.0 0.1 1264 228 pts/4 S Apr29 0:00 ping eric root 9418 0.0 0.4 1360 516 ttyp0 S 00:06 0:00 grep ping [root@linus /root]# pidof ping 9149 [root@linus /root]# lsof -p 9149 COMMAND PID USER FD TYPE DEVICE SIZE NODE NAME ping 9149 root cwd DIR 3,7 4096 30919 /home/pto/tmp ping 9149 root rtd DIR 3,5 4096 2 / ping 9149 root txt REG 3,5 17968 114094 /bin/ping ping 9149 root mem REG 3,5 340663 16023 /lib/ld-2.1.3.so ping 9149 root mem REG 3,5 169720 16071 /lib/libresolv-2.1.3.so ping 9149 root mem REG 3,5 4101324 16030 /lib/libc-2.1.3.so ping 9149 root mem REG 3,5 246652 16061 /lib/libnss_files-2.1.3.so ...
Så man kan se, at programmer har fat i mange filer. Det skal nævnes at pidof kræver at SysVinit-pakken er installeret og stien til pidof varierer desværre alt efter Linux-distribution. Det skal også nævnes, at ps aux bruges på en Linux-maskine, mens mange andre Unix-varianter anvender ps -ef.
Tilsvarende kan man have stor glæde af at kunne se, hvilke programmer der har filer åbne under et givet katalog i filtræet. Det er meget relevant ved afmontering af f.eks. cd-rom-drev. Prøv følgende:
[root@linus /root]# lsof +D /var/spool COMMAND PID USER FD TYPE DEVICE SIZE NODE NAME atd 459 root cwd DIR 3,5 4096 32594 /var/spool/at crond 473 root cwd DIR 3,5 4096 12 /var/spool/ lpd 9299 root 4w REG 3,5 5 4507 /var/spool/lpd/lpd.lock
Eksemplet viser, at der er tre programmer at, crond og lpd som pt. anvender filer under /var/spool. Meget nyttige ting for en systemadministrator.
Et tilsvarende nyttigt program til nogenlunde samme formål er /sbin/fuser DEVICE. F.eks. kan man se hvilket proces-ID, som låser lydenheden /dev/dsp ved at skrive /sbin/fuser /dev/dsp. Med /sbin/fuser -k /dev/dsp kan man endda direkte dræbe den proces som låser enheden.
Et alternativ til ovenstående er at anvende /proc/. Antag at man vil afmontere /usr/src/postgresql-7.2.1/
[root@linus /root]# umount /usr/src/postgresql-7.2.1/ umount: /usr/src/postgresql-7.2.1: device is busy
Hvem pokker er synderne?
[root@linus /root]# ls -l /proc/*/cwd|grep /usr/src/postgresql-7.2.1/ lrwxrwxrwx 1 postgres postgres 0 Apr 30 03:49 /proc/3943/cwd -> /usr/src/postgresql-7.2.1/ lrwxrwxrwx 1 postgres postgres 0 Apr 30 03:49 /proc/3944/cwd -> /usr/src/postgresql-7.2.1/ lrwxrwxrwx 1 postgres postgres 0 Apr 30 03:49 /proc/3950/cwd -> /usr/src/postgresql-7.2.1/
Aha! Det er således processerne 3943 3944 3950 som låser filsystemet.
[root@linus /root]# kill -9 3943 3944 3950
Nogen kunne sikkert lave et script, der gjorde dræbningen nemmere:
perl -e '$dir=shift; map {m:/proc/(\d+)/cwd -> $dir[/\n]: and do {print "$1\n"; kill 9, $1 } } `ls -l /proc/*/cwd`' /usr/src/postgresql-7.2.1/