Как использовать ps, kill и nice для управления процессами в Linux
Введение
Сервер Linux, как и любой современный компьютер, запускает несколько приложений. Они называются отдельными процессами и управляются ими.
В то время как Linux будет выполнять низкоуровневое скрытое управление жизненным циклом процесса, т. е. запуск, завершение работы, выделение памяти и т. д., вам потребуется способ взаимодействия с операционной системой, чтобы управлять ими из более высокий уровень.
В этом руководстве вы познакомитесь с некоторыми фундаментальными аспектами управления процессами. Linux предоставляет для этой цели ряд стандартных встроенных инструментов.
Вы изучите эти идеи в среде Ubuntu 20.04, но любой современный дистрибутив Linux будет работать аналогичным образом.
Шаг 1 — Как просмотреть запущенные процессы в Linux
Вы можете увидеть все процессы, запущенные на вашем сервере, с помощью команды top
:
- top
Outputtop - 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
:
- sudo apt install htop
После этого будет доступна команда htop
:
- 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
без каких-либо аргументов дает очень мало информации:
- ps
Output PID TTY TIME CMD
1017 pts/0 00:00:00 bash
1262 pts/0 00:00:00 ps
Этот вывод показывает все процессы, связанные с текущим сеансом пользователя и терминала. Это имеет смысл, если в настоящее время вы используете только оболочку bash
и эту команду ps
в этом терминале.
Чтобы получить более полное представление о процессах в этой системе, вы можете запустить ps aux
:
- ps aux
OutputUSER 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
, чтобы вернуть имя определенного процесса. Это полезно, если вы считаете, что произошел сбой, или если вам нужно остановить его по какой-либо причине.
- ps aux | grep bash
Outputsammy 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
:
- pgrep bash
Output1017
Первый процесс, запущенный при загрузке, называется init и получает PID 1.
- pgrep init
Output1
Затем этот процесс отвечает за порождение всех остальных процессов в системе. Более поздним процессам присваиваются большие номера PID.
родительский процесса — это процесс, ответственный за его порождение. Родительские процессы имеют PPID, который можно увидеть в заголовках столбцов во многих приложениях для управления процессами, включая top
, htop
и ps
.
Любое общение между пользователем и операционной системой о процессах включает в себя преобразование между именами процессов и PID в какой-то момент во время операции. Вот почему эти утилиты всегда будут включать PID в свой вывод. В следующем разделе вы узнаете, как использовать PID для отправки сигналов остановки, возобновления или других запущенных процессов.
Шаг 3 – Как отправлять сигналы процессам в Linux
Все процессы в Linux реагируют на сигналы. Сигналы — это способ на уровне операционной системы сообщить программам о завершении или изменении их поведения.
Самый распространенный способ передачи сигналов программе — это команда kill
. Как и следовало ожидать, по умолчанию эта утилита пытается убить процесс:
- kill PID_of_target_process
Это отправляет сигнал TERM процессу. Сигнал TERM говорит процессу завершиться. Это позволяет программе выполнять операции очистки и плавно завершать работу.
Если программа ведет себя неправильно и не завершается при получении сигнала TERM, вы можете усилить сигнал, передав сигнал KILL
:
- kill -KILL PID_of_target_process
Это специальный сигнал, который не передается программе.
Вместо этого он передается ядру операционной системы, которое останавливает процесс. Это используется для обхода программ, которые игнорируют отправленные им сигналы.
Каждый сигнал имеет связанный с ним номер, который можно передать вместо имени. Например, Вы можете передать «-15» вместо «-TERM» и «-9» вместо «-KILL».
Сигналы используются не только для закрытия программ. Их также можно использовать для выполнения других действий.
Например, многие процессы, предназначенные для постоянной работы в фоновом режиме (иногда называемые «демонами»), автоматически перезапускаются при получении HUP
или зависания. Веб-сервер Apache обычно работает таким образом.
- sudo kill -HUP pid_of_apache
Приведенная выше команда заставит Apache перезагрузить файл конфигурации и возобновить обслуживание контента.
Примечание. Многие фоновые процессы, подобные этому, управляются через системные службы, которые предоставляют дополнительную поверхность для взаимодействия с ними, и обычно предпочтительнее перезапустить саму службу, а не отправлять HUP
сигнал напрямую одному запущенному процессу. Если вы просмотрите файлы конфигурации различных служб, вы можете обнаружить, что различные хуки service restart
предназначены именно для этого — отправки сигналов определенным процессам — а также предоставления журналов и других отчетов.
Вы можете перечислить все сигналы, которые можно отправить с помощью kill
с флагом -l
:
- kill -l
Output1) 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
, но вместо этого оперирует именем процесса:
- pkill -9 ping
Приведенная выше команда эквивалентна:
- kill -9 `pgrep ping`
Если вы хотите отправить сигнал каждому экземпляру определенного процесса, вы можете использовать команду killall
:
- killall firefox
Приведенная выше команда отправит сигнал TERM каждому экземпляру firefox
, запущенному на компьютере.
Шаг 4 – Как настроить приоритеты процессов
Часто вам потребуется настроить приоритет процессов в серверной среде.
Некоторые процессы могут считаться критически важными для вашей ситуации, в то время как другие могут выполняться при наличии оставшихся ресурсов.
Linux управляет приоритетом с помощью значения, называемого приятностью.
Задачи с высоким приоритетом считаются менее хорошими, поскольку они также не используют общие ресурсы. Процессы с низким приоритетом, с другой стороны, хороши, потому что требуют минимум ресурсов.
Когда вы запустили top
в начале статьи, там был столбец с пометкой \NI. Это хорошее значение процесса:
- 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
:
- nice -n 15 command_to_execute
Это работает только при запуске новой программы.
Чтобы изменить значение nice программы, которая уже выполняется, вы используете инструмент под названием renice
:
- renice 0 PID_to_prioritize
Заключение
Управление процессами — фундаментальная часть Linux, полезная практически в любом контексте. Даже если вы не занимаетесь администрированием системы, возможность отследить застрявшие процессы и тщательно с ними справиться очень полезна.
Далее вы можете узнать, как использовать netstat
и du
для мониторинга других ресурсов сервера.