Азы работы в командной строке Linux (часть 7)


Предыдущие части:

В этой части мы научимся наблюдать за процессами в Linux, это может быть полезным для решения проблем с производительностью. Например, система медленно работает из-за того, что какая-то программа полностью использует центральный процессор или заняла всю оперативную память. Мы научимся находить и останавливать процессы, которые потребляют больше всего ресурсов, просматривать все запущенные процессы, менять их приоритет и выполнять другие действия с ними.

top для показа процессов в реальном времени

У программы top есть опции, но большую часть настройки можно сделать интерактивными командами в запущенной программе. Для запуска выполните:

top

В самом верху информация об использовании ресурсов центрального процессора и оперативной памяти. Если ваша система «тормозит», работает медленно, то посмотрите, что именно происходит: полностью загружен процессор или закончилась память.

На моём скриншоте проблем с производительностью нет, но давайте представим, что полностью загружен центральный процессор. Процессы отсортированы по уровню потребления времени ЦПУ — от самого прожорливого (то есть в порядке убывания). Чтобы убедиться в этом нажмите кнопку x — будет подсвечен столбец по которому выполняется сортировка.

Если закончилась оперативная память, то нужно сделать сортировку процессов по потреблению памяти. Для переключения столбца нажимайте клавиши < и >. Это не символы курсорных клавишей. Это символы на английской раскладке, которые на русской раскладке находятся на буквах «б» и «ю». Чтобы отправить этот символ, нужно нажать Shift+, (запятая) и Shift+. (точка).

Теперь процессы отфильтрованы по столбцу %MEM (память):

Как можно увидеть, на моей системе больше всего памяти потребляет процесс libreoffice (офисные приложения) и chromium (веб-браузер).

Для включения/отключения цвета: z

Для включения/отключения полужирных шрифтов: b

Для показов команды запуска: c

Для включения и отключения древовидного вывода процессов: V (то есть Shift+v)

Можно выводить до четырёх отдельных вкладок (окон) программы top в одном окне — в каждой из них можно сделать разные настройки вывода. Подробности смотрите в статье «Как пользоваться командой top для наблюдения за процессами в Linux».

htop — простая альтернатива top

В программе top можно искать (фильтровать) процессы, останавливать их, менять порядок и тип выводимых столбцов. Но каждое это действие выполняется командой, которую нужно помнить — это неудобно. В программе htop самые востребованные функции по управлению процессами назначены на функциональные клавиши F1-F12 и информация о них всегда присутствует на экране. То есть программа htop похожа на top, но проще в использовании:

Программа htop по умолчанию раскрашена цветами, выводит команды процессов и подсвечивает колонку, по которой выполняется сортировка.

Больше способов настройки и деталей использования вы найдёте в статье «Инструкция по использованию команды htop для интерактивного просмотра процессов в Linux».


systemctl для просмотра состояния служб

Если вам интересует, что происходит с определённой службой — запущена ли она, возникла ли ошибка при запуске или с ней всё в порядке, то вместо поиска службы для интерактивного показа процессов или снимка процессов, удобнее использовать команду systemctl.

Службы (демоны) работают в фоне, примеры популярных служб: sshd, apache2 (веб-сервер в Debian и производных), httpd (веб-сервер в Arch Linux и производных), iptables (файервол).

К примеру, меня интересует, запущена ли служба SSH сервера на компьютере, на котором я в данный момент работаю, тогда мне нужно выполнить следующую команду:

systemctl status sshd

Служба SSH сервера не запущена.

Просмотр статуса веб-сервера:

systemctl status httpd

Про управление службами смотрите статью «Как использовать Systemctl для управления службами Systemd и юнитами».

ps для получения снимка процессов

Программы top и htop выводят на экран постоянно обновляемую информацию о процессах, а программа ps выводит информацию один раз на момент выполнения программы.

Программу ps удобно использовать, если нужно просто проверить, запущен ли определённый процесс, либо узнать идентификатор процесса, либо для работы с процессами в скриптах. Кстати, программа top тоже умеет выводить снимок процессов — в инструкции, на которую выше дана ссылка, написано как это сделать.

Чтобы вывести список всех активных процессов:

ps -e

В таком списке удобно искать с помощью grep:

ps -e | grep firefox

Смотрите «Регулярные выражения и команда grep».


Следующая команда выведет все процессы (-e), для процессов будут показаны поля Идентификатор процесса, Идентификатор родительского процесса, потребление времени ЦПУ, потребление памяти, команда и аргументы, которой был запущен процесс (-o pid,ppid,pcpu,pmem,args), будет показано дерево процессов (—forest) и процессы будут отсортированы по использованию процессора в порядке убывания (—sort -pcpu):


ps -e -o pid,ppid,pcpu,pmem,args --forest --sort -pcpu

Интересный пример комбинирования команд ps с watch и head — будет выведен список топ-10 процессов, потребляющих оперативную память, этот список будет обновляться каждую секунду:

watch -n 1 'ps -eo pid,ppid,cmd,%mem,%cpu --sort=-%mem | head'

Как и предыдущая команда, но для потребителей ЦПУ:

watch -n 1 'ps -eo pid,ppid,cmd,%mem,%cpu --sort=-%cpu | head'

Больше примеров смотрите в статье «Как использовать команду ps для мониторинга процессов Linux».

lsof для показа открытых файлов

Файлы открываются процессами. Иногда нужно знать, какие файлы открыл процесс или каким процессом открыт файл. Это может понадобиться для мониторинга активности процессов, либо для решения проблем, когда невозможно выполнить действие из-за того, что какой-то процесс использует файл.

Чтобы увидеть, какой процесс открыл файл, нужно указать путь до этого файла:

lsof 'Documents/Linux.odt'

В качестве файла могут быть устройства, например, жёсткий диск:

lsof /dev/sda

Чтобы увидеть все файлы, которые открыты в определённом каталоге, используйте опцию +D и укажите путь до каталога, например, для просмотра всех открытых файлов в директории /var/log/ и открывших их процессов:

sudo lsof +D /var/log/

В столбце COMMAND показано имя процесса, открывшего файл, а в столбце PID показан идентификатор процесса.

Чтобы увидеть все файлы, которые были открыты из каталога /home:

sudo lsof +D /home

Чтобы показать все открытые на дисках файлы:

sudo lsof /

Чтобы увидеть файлы, которые были открыты определенным процессом, используйте параметр -c КОМАНДА:

sudo lsof -c ssh

Ещё больше примеров в статье «Как пользоваться lsof для просмотра открытых файлов (в Linux всё является файлами)».


pstree для вывода дерева процессов

Программа pstree показывает дерево процессов, то есть связи между родительскими и дочерними процессами:

pstree -l

pgrep для поиска процесса

Вместо запуска ps и последующей фильтрации с помощью grep можно использовать одну команду pgrep, которая запускается так:

pgrep ИМЯ_ПРОЦЕССА

Например, для поиска процесса firefox:

pgrep firefox

Если процесс найден, то будет выведен его идентификатор (PID), а если процесс не найден, то ничего не будет выведено.

Если указать опцию -a, то заодно будет выведен и полный путь до исполнимого файла:

pgrep -a firefox
24664 /usr/lib/firefox/firefox

kill, pkill и killall для остановки процесса

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

kill ИДЕНТИФИКАТОР_ПРОЦЕССА
pkill ИМЯ_ПРОЦЕССА
killall ИМЯ_ПРОЦЕССА

Разница между командами pkill и killall в том, что pkill принимаемое ИМЯ_ПРОЦЕССА использует для поиска как по всему имени, так и по части имени. А killall по умолчанию ищет точное совпадение имени процесса. То есть если вместо «firefox» указать «firef», то pkill закроет все процессы firefox, а killall не закроет ни одного процесса.

Примеры:

kill 24664
pkill firefox
killall firefox

Как увидеть сообщения, которые выводят процессы

Если при запуске утилиты в командной строке что-то не в порядке (например, отсутствует необходимая зависимость), то программа перед завершением работы выводит сообщение об ошибке. На самом деле, в консоль могут выводиться не только ошибки, но и обычные сообщения о работе программы. К тому же, не только программы с интерфейсом командной строки выводят сообщения, но и программы с графическим интерфейсом, а также демоны (процессы, отсоединённые от терминала), также выводят сообщения, которые хранятся в системных журналах.

Чтобы увидеть ошибки и сообщения, которые выводят процессы запустите команду вида:

sudo journalctl _COMM=ПРОГРАММА

Например, чтобы увидеть сообщения от процесса sshd:

sudo journalctl _COMM=sshd

Если добавить опцию -f, то новые сообщения будут выводиться по мере их появления:

sudo journalctl -f _COMM=NetworkManager

Это работает и для приложений с графическим интерфейсом:

sudo journalctl -f _COMM=chromium

Чтобы увидеть все сообщения от любых служб, выполните такую команду (может пригодиться при выяснении причин, почему не работает веб-сервер, MySQL или SSH сервер или почему не запускается OpenVPN и т.д.):

sudo journalctl -xe

Чтобы показать записи в системном журнале одного процесса с указанным PID:

sudo journalctl _PID=409200

Смотрите также «Как использовать journalctl для просмотра системных логов Linux».

Программы для работы с процессами в Linux

Подробные статьи по каждой из рассмотренных программ:


Рекомендуется Вам:

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *