3.7. Hvilke filer har programmet åbne?

3.7.1. lsof

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.

3.7.2. fuser

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.

3.7.3. Afmontering af filsystem via /proc

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/