Очень часто, при работе с какой-либо из операционных систем UNIX, возникает необходимость узнать, кто работает с тем или иным файлом. В UNIX любое устройство или данные представляются в виде файла. Файлы могут быть разных видов — символьные, блочные, каталоги и собственно файлы с данными. Поэтому, работающая система обычно имеет большое количество открытых файлов. Если возникает необходимо узнать, кто и зачем открыл файл, процесс или пользователь, то на этот случай в UNIX имеется утилита lsof (list open files), исходные тексты которой доступны по следующей ссылке. С помощью данной утилиты можно узнать, какие файлы открыты процессом если известен его PID, какие процессы открыли файл, если известно его имя, и много другое. Например, чтобы узнать кто запустил на выполнение команду mc, необходимо выполнить команду:
# lsof /usr/bin/mc COMMAND PID USER FD TYPE DEVICE SIZE NODE NAME mc 30593 root txt REG 0,47 607316 188702040 /usr/bin/mc
чтобы получить PID процесса открывшего файл /usr/bin/mc, нужно выполнить:
# lsof -t /usr/bin/mc 30593
чтобы поглядеть файлы, открытые определённым пользователем, необходимо выполнить:
# lsof -u apache COMMAND PID USER FD TYPE DEVICE SIZE NODE NAME httpd 7859 apache cwd DIR 0,47 4096 181995782 / httpd 7859 apache rtd DIR 0,47 4096 181995782 /
для того, чтобы увидеть файлы открытые каким-либо процессом, следует выполнить:
# lsof -p 30593 COMMAND PID USER FD TYPE DEVICE SIZE NODE NAME mc 30593 root cwd DIR 0,47 36864 188679876 /usr/bin mc 30593 root rtd DIR 0,47 4096 181995782 / mc 30593 root txt REG 0,47 607316 188702040 /usr/bin/mc
Так как сокеты в системе представляются в виде файлов, точнее работа ведётся с ними через дескрипторы, то поэтому, через lsof можно получить список открытых сокетов и соединений, с помощью следующей команды:
# lsof -i COMMAND PID USER FD TYPE DEVICE SIZE NODE NAME httpd 7859 apache 3u IPv4 128438251 TCP *:http (LISTEN) httpd 7879 apache 3u IPv4 128438251 TCP *:http (LISTEN) httpd 7880 apache 3u IPv4 128438251 TCP *:http (LISTEN)
можно ограничить вывод информации только по определенному порту:
# lsof -i:22 COMMAND PID USER FD TYPE DEVICE SIZE NODE NAME sshd 28438 root 3u IPv4 85888179 TCP *:ssh (LISTEN)
При использования ключа -i lsof может работать довольно долго. Связано это с тем, что при работе она пытается отрезолвить IP-адреса и номера портов. Чтобы ускорить работу lsof, следует дополнительно указать ключ -n, который запрещает резолвить IP-адреса и номера портов.
Если необходимо просмотреть файлы открытые на файловых системах подмонтированных через NFS, нужно использовать следующую команду:
lsof –N
Также, при запуске утилиты lsof можно указывать дополнительные условия которые будут применяться через логическое «И» или «НЕ», «ИЛИ» к запрашиваемым данным. По умолчанию к указанным аргументам применяется логическое «ИЛИ» при генерации вывода. Если указать опцию -a, то в этом случае, при генерации вывода будет применяться логическое «И», причём ко всем указанным аргументам. Например:
# lsof -u ^root -a /var COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME qmail-sen 34220 qmails cwd VDIR 0,91 512 5 /var/qmail/queue qmail-cle 34223 qmailq cwd VDIR 0,91 512 5 /var/qmail/queue qmail-tod 34224 qmails cwd VDIR 0,91 512 5 /var/qmail/queue qmail-cle 34225 qmailq cwd VDIR 0,91 512 5 /var/qmail/queue
эта команда покажет открытые файлы не пользователем root и на разделе /var.
Более подробную информацию по использованию lsof можно получить из man'а, а также из FAQ'а команде.