Поиск по сайту:

Как использовать ps, kill и nice для управления процессами в Linux


Введение

Сервер Linux, как и любой современный компьютер, запускает несколько приложений. Они называются отдельными процессами и управляются ими.

В то время как Linux будет выполнять низкоуровневое скрытое управление жизненным циклом процесса, т. е. запуск, завершение работы, выделение памяти и т. д., вам потребуется способ взаимодействия с операционной системой, чтобы управлять ими из более высокий уровень.

В этом руководстве вы познакомитесь с некоторыми фундаментальными аспектами управления процессами. Linux предоставляет для этой цели ряд стандартных встроенных инструментов.

Вы изучите эти идеи в среде Ubuntu 20.04, но любой современный дистрибутив Linux будет работать аналогичным образом.

Шаг 1 — Как просмотреть запущенные процессы в Linux

Вы можете увидеть все процессы, запущенные на вашем сервере, с помощью команды top:

  1. top
Output
top - 15:14:40 up 46 min, 1 user, load average: 0.00, 0.01, 0.05 Tasks: 56 total, 1 running, 55 sleeping, 0 stopped, 0 zombie Cpu(s): 0.0%us, 0.0%sy, 0.0%ni,100.0%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st Mem: 1019600k total, 316576k used, 703024k free, 7652k buffers Swap: 0k total, 0k used, 0k free, 258976k cached PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND 1 root 20 0 24188 2120 1300 S 0.0 0.2 0:00.56 init 2 root 20 0 0 0 0 S 0.0 0.0 0:00.00 kthreadd 3 root 20 0 0 0 0 S 0.0 0.0 0:00.07 ksoftirqd/0 6 root RT 0 0 0 0 S 0.0 0.0 0:00.00 migration/0 7 root RT 0 0 0 0 S 0.0 0.0 0:00.03 watchdog/0 8 root 0 -20 0 0 0 S 0.0 0.0 0:00.00 cpuset 9 root 0 -20 0 0 0 S 0.0 0.0 0:00.00 khelper 10 root 20 0 0 0 0 S 0.0 0.0 0:00.00 kdevtmpfs

Первые несколько строк вывода предоставляют системную статистику, такую как загрузка ЦП/памяти и общее количество запущенных задач.

Вы можете видеть, что есть 1 запущенный процесс и 55 процессов, которые считаются спящими, поскольку они не используют активно циклы ЦП.

Остальная часть отображаемого вывода показывает запущенные процессы и статистику их использования. По умолчанию top автоматически сортирует их по загрузке ЦП, поэтому вы сначала видите самые загруженные процессы. top будет продолжать работать в вашей оболочке, пока вы не остановите его, используя стандартную комбинацию клавиш Ctrl+C для выхода из запущенного процесса. Это отправляет сигнал kill, предписывая процессу корректно остановиться, если он в состоянии это сделать.

Улучшенная версия top, называемая htop, доступна в большинстве репозиториев пакетов. В Ubuntu 20.04 вы можете установить его с помощью apt:

  1. sudo apt install htop

После этого будет доступна команда htop:

  1. htop
Output
Mem[||||||||||| 49/995MB] Load average: 0.00 0.03 0.05 CPU[ 0.0%] Tasks: 21, 3 thr; 1 running Swp[ 0/0MB] Uptime: 00:58:11 PID USER PRI NI VIRT RES SHR S CPU% MEM% TIME+ Command 1259 root 20 0 25660 1880 1368 R 0.0 0.2 0:00.06 htop 1 root 20 0 24188 2120 1300 S 0.0 0.2 0:00.56 /sbin/init 311 root 20 0 17224 636 440 S 0.0 0.1 0:00.07 upstart-udev-brid 314 root 20 0 21592 1280 760 S 0.0 0.1 0:00.06 /sbin/udevd --dae 389 messagebu 20 0 23808 688 444 S 0.0 0.1 0:00.01 dbus-daemon --sys 407 syslog 20 0 243M 1404 1080 S 0.0 0.1 0:00.02 rsyslogd -c5 408 syslog 20 0 243M 1404 1080 S 0.0 0.1 0:00.00 rsyslogd -c5 409 syslog 20 0 243M 1404 1080 S 0.0 0.1 0:00.00 rsyslogd -c5 406 syslog 20 0 243M 1404 1080 S 0.0 0.1 0:00.04 rsyslogd -c5 553 root 20 0 15180 400 204 S 0.0 0.0 0:00.01 upstart-socket-br

htop обеспечивает лучшую визуализацию нескольких потоков процессора, лучшее понимание поддержки цвета в современных терминалах и больше возможностей сортировки, среди других функций. В отличие от top, он не всегда устанавливается по умолчанию, но его можно рассматривать как замену. Вы можете выйти из htop, нажав Ctrl+C, как с top. Вы также можете узнать больше о том, как использовать top и htop.

В следующем разделе вы узнаете, как использовать инструменты для запросов к определенным процессам.

Шаг 2 – Как использовать ps для получения списка процессов

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

Запуск ps без каких-либо аргументов дает очень мало информации:

  1. ps
Output
PID TTY TIME CMD 1017 pts/0 00:00:00 bash 1262 pts/0 00:00:00 ps

Этот вывод показывает все процессы, связанные с текущим сеансом пользователя и терминала. Это имеет смысл, если в настоящее время вы используете только оболочку bash и эту команду ps в этом терминале.

Чтобы получить более полное представление о процессах в этой системе, вы можете запустить ps aux:

  1. ps aux
Output
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND root 1 0.0 0.2 24188 2120 ? Ss 14:28 0:00 /sbin/init root 2 0.0 0.0 0 0 ? S 14:28 0:00 [kthreadd] root 3 0.0 0.0 0 0 ? S 14:28 0:00 [ksoftirqd/0] root 6 0.0 0.0 0 0 ? S 14:28 0:00 [migration/0] root 7 0.0 0.0 0 0 ? S 14:28 0:00 [watchdog/0] root 8 0.0 0.0 0 0 ? S< 14:28 0:00 [cpuset] root 9 0.0 0.0 0 0 ? S< 14:28 0:00 [khelper] …

Эти параметры указывают ps показывать процессы, принадлежащие всем пользователям (независимо от их терминальной связи) в более удобном для человека формате.

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

  1. ps aux | grep bash
Output
sammy 41664 0.7 0.0 34162880 2528 s000 S 1:35pm 0:00.04 -bash sammy 41748 0.0 0.0 34122844 828 s000 S+ 1:35pm 0:00.00 grep bash

Это возвращает как только что запущенный процесс grep, так и оболочку bash, которая запущена в данный момент. Он также возвращает их общий объем памяти и использование ЦП, как долго они работают, а в выделенном выше выводе — их идентификатор процесса. В Linux и Unix-подобных системах каждому процессу назначается идентификатор процесса или PID. Именно так операционная система идентифицирует и отслеживает процессы.

Быстрый способ получить PID процесса — использовать команду pgrep:

  1. pgrep bash
Output
1017

Первый процесс, запущенный при загрузке, называется init и получает PID 1.

  1. pgrep init
Output
1

Затем этот процесс отвечает за порождение всех остальных процессов в системе. Более поздним процессам присваиваются большие номера PID.

родительский процесса — это процесс, ответственный за его порождение. Родительские процессы имеют PPID, который можно увидеть в заголовках столбцов во многих приложениях для управления процессами, включая top, htop и ps.

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

Шаг 3 – Как отправлять сигналы процессам в Linux

Все процессы в Linux реагируют на сигналы. Сигналы — это способ на уровне операционной системы сообщить программам о завершении или изменении их поведения.

Самый распространенный способ передачи сигналов программе — это команда kill. Как и следовало ожидать, по умолчанию эта утилита пытается убить процесс:

  1. kill PID_of_target_process

Это отправляет сигнал TERM процессу. Сигнал TERM говорит процессу завершиться. Это позволяет программе выполнять операции очистки и плавно завершать работу.

Если программа ведет себя неправильно и не завершается при получении сигнала TERM, вы можете усилить сигнал, передав сигнал KILL:

  1. kill -KILL PID_of_target_process

Это специальный сигнал, который не передается программе.

Вместо этого он передается ядру операционной системы, которое останавливает процесс. Это используется для обхода программ, которые игнорируют отправленные им сигналы.

Каждый сигнал имеет связанный с ним номер, который можно передать вместо имени. Например, Вы можете передать «-15» вместо «-TERM» и «-9» вместо «-KILL».

Сигналы используются не только для закрытия программ. Их также можно использовать для выполнения других действий.

Например, многие процессы, предназначенные для постоянной работы в фоновом режиме (иногда называемые «демонами»), автоматически перезапускаются при получении HUP или зависания. Веб-сервер Apache обычно работает таким образом.

  1. sudo kill -HUP pid_of_apache

Приведенная выше команда заставит Apache перезагрузить файл конфигурации и возобновить обслуживание контента.

Примечание. Многие фоновые процессы, подобные этому, управляются через системные службы, которые предоставляют дополнительную поверхность для взаимодействия с ними, и обычно предпочтительнее перезапустить саму службу, а не отправлять HUP сигнал напрямую одному запущенному процессу. Если вы просмотрите файлы конфигурации различных служб, вы можете обнаружить, что различные хуки service restart предназначены именно для этого — отправки сигналов определенным процессам — а также предоставления журналов и других отчетов.

Вы можете перечислить все сигналы, которые можно отправить с помощью kill с флагом -l:

  1. kill -l
Output
1) SIGHUP 2) SIGINT 3) SIGQUIT 4) SIGILL 5) SIGTRAP 6) SIGABRT 7) SIGBUS 8) SIGFPE 9) SIGKILL 10) SIGUSR1 11) SIGSEGV 12) SIGUSR2 13) SIGPIPE 14) SIGALRM 15) SIGTERM

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

Команда pkill работает почти так же, как kill, но вместо этого оперирует именем процесса:

  1. pkill -9 ping

Приведенная выше команда эквивалентна:

  1. kill -9 `pgrep ping`

Если вы хотите отправить сигнал каждому экземпляру определенного процесса, вы можете использовать команду killall:

  1. killall firefox

Приведенная выше команда отправит сигнал TERM каждому экземпляру firefox, запущенному на компьютере.

Шаг 4 – Как настроить приоритеты процессов

Часто вам потребуется настроить приоритет процессов в серверной среде.

Некоторые процессы могут считаться критически важными для вашей ситуации, в то время как другие могут выполняться при наличии оставшихся ресурсов.

Linux управляет приоритетом с помощью значения, называемого приятностью.

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

Когда вы запустили top в начале статьи, там был столбец с пометкой \NI. Это хорошее значение процесса:

  1. top
[secondary_label Output] 
Tasks:  56 total,   1 running,  55 sleeping,   0 stopped,   0 zombie
Cpu(s):  0.0%us,  0.3%sy,  0.0%ni, 99.7%id,  0.0%wa,  0.0%hi,  0.0%si,  0.0%st
Mem:   1019600k total,   324496k used,   695104k free,     8512k buffers
Swap:        0k total,        0k used,        0k free,   264812k cached

  PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND           
 1635 root      20   0 17300 1200  920 R  0.3  0.1   0:00.01 top                
    1 root      20   0 24188 2120 1300 S  0.0  0.2   0:00.56 init               
    2 root      20   0     0    0    0 S  0.0  0.0   0:00.00 kthreadd           
    3 root      20   0     0    0    0 S  0.0  0.0   0:00.11 ksoftirqd/0

Значения Nice могут варьироваться от -19/-20 (самый высокий приоритет) до 19/20 (самый низкий приоритет) в зависимости от системы.

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

  1. nice -n 15 command_to_execute

Это работает только при запуске новой программы.

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

  1. renice 0 PID_to_prioritize

Заключение

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

Далее вы можете узнать, как использовать netstat и du для мониторинга других ресурсов сервера.