psmisc: рассмотрим ближе стандартный пакет

Автор: Адриан фон Биддер (Adrian von Bidder)
Перевод: Алексей Бешенов

2008-03-12

Автор: Адриан вон Биддер (Adrian von Bidder). Оригинал: «psmisc: a closer look to a standard package» , 13 января 2008 г.

Пакет psmisc установлен практически во всех системах Debian и Ubuntu и содержит несколько маленьких программ, связанных с управлением процессами Unix: pstree, killall, fuser и peekfd. Ниже следует краткое описание этих полезных средств. Хотя, конечно, все знают про killall и даже про pstree, в пакете также есть fuser и peekfd, которые для меня лично до недавнего времени были новыми (хотя я слышал, что по крайней мере fuser существует давно; позор мне).

killall столь же ужасен, как и называется: он убивает все процессы с указанным именем. По умолчанию используется SIGTERM, но, конечно, может посылаться любой другой сигнал. Также есть опции определения процессов регулярными выражениями или по группам. Обычно я использую это для уничтожения элементов KDE командой вроде

$ killall kio_imap4
Это приходится делать, так как у KMail есть некоторые проблемы с работой с моим IMAP-сервером. (Отдельно стоит упомянуть программу slay из пакета slay, которая просто убивает процессы, принадлежащие указанному пользователю.)

Хороший обзор того, что запущено в системе, дает вывод pstree. Вот часть вывода у меня:

$ pstree
init─┬─NetworkManager───2*[{NetworkManager}]
     ├─NetworkManagerD
     ├─acpid
     ├─hald───hald-runner─┬─hald-addon-acpi
     │                    ├─hald-addon-cpuf
     │                    ├─hald-addon-dell
     │                    ├─hald-addon-inpu
     │                    └─hald-addon-stor
     ├─kdeinit─┬─artsd
     │         ├─2*[kio_file]
     │         ├─kio_http
     │         ├─3*[kio_imap4]
     │         ├─kioexec───wfica.sh───wfica
     │         ├─klauncher
     │         ├─konqueror
     │         ├─konsole───bash─┬─pstree
     │         │                └─xchat───{xchat}
     │         └─kwin
     ├─kdesktop───lineakd───2*[{lineakd}]
     ├─kdm─┬─Xorg
     │     └─kdm───startkde───kwrapper
     └─sshd

Опции pstree включают отображение идентификаторов процессов, пользователей и контекстов безопасности SE Linux.

fuser позволяет выяснить, какой процесс использует определенный файл, например:

$ fuser -v /home/avbidder/.xsession-errors
                    USER        PID ACCESS COMMAND
/home/avbidder/.xsession-errors:
                    avbidder   4409 F.... startkde
                    avbidder   4533 F.... kdeinit
                    avbidder   4536 F.... dcopserver
                    avbidder   4538 F.... klauncher
                    avbidder   4540 F.... kded
                    avbidder   4547 F.... kwrapper
                    avbidder   4549 F.... ksmserver
                    avbidder   4550 F.... kwin
                    avbidder   4552 F.... kdesktop
                    avbidder   4554 F.... kicker
                    avbidder   4562 F.... artsd
                    avbidder   4567 F.... kmix
                    avbidder   4568 F.... konsole
                    avbidder   4572 F.... beagled
                    avbidder   4574 F.... lineakd
                    avbidder   4579 F.... knetworkmanager
                    avbidder   4680 F.... knotify
                    avbidder   4916 F.... kio_uiserver
                    avbidder   5706 F.... akregator
                    avbidder   5708 F.... kttsd
                    avbidder   5742 F.... kio_file
                    avbidder   5864 F.... beagled-helper
                    avbidder   6939 F.... konqueror
                    avbidder   7076 F.... konqueror
                    avbidder   7185 F.... kmail
                    avbidder   7696 F.... kio_imap4

Также fuser может посылать сигналы этим программам, так что вы можете убить их при помощи
fuser -k /home/avbidder/.xsession-errors 
(по умолчанию используется SIGKILL, но это, разумеется, можно поменять.)

В то время как fuser — обычный инструмент системного администратора, peekfd осуществляет более глубокое погружение: он позволяет смотреть, что происходит с файловым дескриптором процесса. (Обратите внимание: peekfd нет в Etch, требуется psmisc из Lenny или еще новее.)

Если вы запустите в терминале peekfd, команда просмотрит все дескрипторы процессов, чтобы вывести приблизительно такое:

 $ peekfd 7808

writing fd 1: foo bar

Здесь 7808 — просто cat >/dev/null в другом окне терминала, и я пишу там «foo bar». Страница руководства предупреждает, что отслеживаемые процессы могут завершаться; я с этим не встречался, но мне случалось получать несколько раз ошибку segmentation fault от peekfd, так что мне кажется, что за кулисами прячется настоящая черная магия.

Вместо отслеживания всего ввода-вывода процесса, можно получить просто список файлов, которые процесс открывал. Узнать, какие дескрипторы стоит проверить, удобно при помощи директории /proc//fd.

Итак, я надеюсь, что эта статья поможет более пристально взглянуть на пакеты, которые вы устанавливали еще со времен Potato и с тех пор внимательно не изучали…