Perl для системного администрирования




Отслеживание операций с файлами и сетью - часть 8


Каждое поле начинается с буквы, определяющей его содержимое (о -идентификатор процесса (pid), с - команда, и - идентификатор пользователя (uid) и L - имя пользователя (login)), и заканчивается символом разделителя. Все поля в строке создают набор процесса. Все последующие строки вплоть до очередного набора процесса описывают открытые файлы/сетевые соединения процесса, описываемого своим набором.

Давайте используем этот режим. Если необходимо вывести список всех открытых файлов и процессов, обращающихся к ним, можно применить такую программу:

use Text::Wrap;

Slsofexec = "/usr/local/Din/lsof"; 8 путь к Isof

8 режим (F)ield, разделитель NUL (0), показывать (L)ogin,

8 тип файла (t)ype и имя файла (n)ame

$lsofflag = "-FLOtn";

open(LSOF,"$lsofexec $lsofflag[") or

die "Невозможно запустить $lsofexec:$!\n";

while(<LSOF>){

8 работаем с набором процесса if (substr($_,0,1) eq "p"){

($pid,$login) = split(/\0/);

$pid = substr($pid,1,length(Spid)); }

# работаем с набором файла.

# Замечание: мы интересуемся только обычными файлами

if (substr($_,0,5) eq "tVREG"){

($type,$pathname) = split(/\0/);

# процесс может дважды открыть один и тот же файл,

# поэтому мы должны убедиться, что запишем его

# только один раз

next if ($seen{$pathname} eq $pid); $seen{$pathname} = $pid;

Spathname = substr($pathname,1,length($pathname));

push(@{$paths{$pathname}},$pid);

}

close(LSOF);

for (sort keys %paths){

print "$_:\n";

print wrap("\t","\t",join(" ",@{$paths{$_}})),"\n";

}

В этом случае Isof будет показывать только некоторые из полей. Можно обойти в цикле весь вывод, собирая имена файлов и идентификаторы процессов в хэш списков. Когда будут обработаны все выведенные данные, следует ввести имена файлов в виде отформатированного списка процессов (спасибо Дэвиду Шарноффу (David Muir Sharnof f) за модуль Text: :Wrap):

/usr (/dev/dsk/cOtOdOs6):

115 117 128 145 150 152 167 171 184 191 200 222 232 238




Содержание  Назад  Вперед