Введение
Когда большинство из нас пользуются компьютерами, мы запускаем различные приложения. Эти приложения запускаются программами, называемыми серверами или операционными системами. Существует множество различных типов серверов, которые работают по-разному. Один из них — Linux. Linux запускает приложения в виде процессов.
В Linux мы называем каждое приложение «процессом». Сервер способен управлять низкоуровневыми аспектами жизненного цикла процесса. Как пользователю, вам может потребоваться взаимодействовать с сервером для управления некоторыми аспектами более высокого уровня. Вы можете общаться с ОС и управлять ею с помощью различных инструментов. Существует множество команд, которые можно использовать для изменения различных аспектов и функций сервера. Вот простое для понимания руководство по простой настройке сервера на базе Linux в Ubuntu. Далее вы можете узнать, как установить стек LAMP (Linux, Apache, MySQL, PHP).
В этом руководстве основное внимание уделяется тому, как использовать ps, kill и nice для управления процессами в Linux.
Просмотр запущенных процессов в Linux
- top
Для начала, одна из самых базовых команд, которую вам следует знать, — это top. Этот инструмент помогает визуализировать, какие процессы в данный момент запущены в системе. Вот как это будет выглядеть при запуске:
|
1 |
top |

В верхней части результата вы можете найти системную статистику. Она предоставляет информацию о таких вещах, как загрузка системы и количество задач. В этом примере вы можете определить, что есть один запущенный процесс и 55 бездействующих процессов. Бездействующие или спящие процессы — это те, которые вы не используете в данный момент. Это означает, что они не занимают системные ресурсы. Наконец, в нижней части всплывающего окна вы можете увидеть все запущенные процессы со статистикой использования.
- htop
Прежде чем использовать эту команду, вам придется установить ее из репозиториев, введя и запустив следующее:
|
1 |
sudo apt-get install htop |
Как только вы его установите, вы сможете использовать его для отображения информации, аналогичной той, что вы получали с помощью top. Основное отличие заключается в том, что с командой htop вы получаете более удобный для пользователя результат:
|
1 |
htop |

Как видите, этот результат легко понять и интерпретировать.
Использование ps для вывода списка процессов
Хотя вы можете использовать вышеупомянутые команды для просмотра запущенных процессов, они не всегда подходят для всех сценариев. К счастью, в нашем распоряжении есть более мощный и гибкий инструмент. Это команда ps.
Давайте посмотрим, что вы увидите, если запустите команду как есть:
|
1 |
ps |

В этом выводе вы можете увидеть все процессы, запущенные в рамках текущего пользователя и сессии. Однако это не дает много информации.
Если вам нужно более целостное представление обо всех процессах, запущенных в системе, вам нужно использовать аргумент. Аргумент позволяет увидеть все процессы, принадлежащие всем пользователям, независимо от привязки к терминалу. Вывод также отображается в очень удобном и легко читаемом формате. Вот пример:
|
1 |
ps aux |

С другой стороны, вы также можете визуализировать эту информацию в виде дерева. Здесь, как вы увидите, иерархические связи также становятся очевидными:
|
1 |
ps axjf |

В этом примере вы можете видеть, как kthreadd отображается в качестве родительского процесса для последующих процессов.
- Что такое идентификаторы процессов?
Как пользователь Linux или Unix, вы должны знать об идентификаторах процессов. Также известные как PID, это уникальные идентификаторы, присваиваемые системой каждому процессу. С помощью этих идентификаторов сервер отслеживает каждый отдельный процесс. Чтобы узнать PID конкретного процесса, вам нужно использовать команду pgrep, например так:
|
1 |
pgrep bash |
|
1 2 |
Output: 1340 |
При загрузке системы запускается первый процесс. Этот процесс называется init. По умолчанию процессу init присваивается PID «1». Вы можете проверить PID этого процесса следующим образом:
|
1 |
pgrep init |
|
1 2 |
Output: 1 |
Затем процесс init отвечает за запуск всех остальных программ или процессов. Разумеется, последующие процессы будут иметь возрастающие или более крупные PID.
- Что такое родительские процессы?
Еще одно понятие, о котором необходимо знать, — это родительский процесс. Если процесс A порождает процесс B, то процесс A является родительским процессом для процесса B. Чтобы помочь отличить их друг от друга, система присваивает родительским процессам PPID. Вы можете заметить этот PPID в заголовках столбцов при запуске любой команды управления, такой как top, htop и ps.
- Что такое родительско-дочерние отношения?
Как мы уже знаем, родительские процессы порождают дочерние процессы. Это создание происходит в два этапа. Первый — fork(). Он начинается с создания нового адресного пространства. Он также копирует ресурсы родительского процесса с использованием механизма копирования при записи (copy-on-write), чтобы они были доступны и в дочернем процессе. Второй — exec(). Он отвечает за загрузку и выполнение исполняемого файла в только что созданном адресном пространстве.
- Что произойдет, если дочерний процесс завершится раньше родительского?
В этом случае дочерний процесс становится зомби. Это продолжается до тех пор, пока родительский процесс не соберет о нем некоторую информацию или не сообщит ядру, что связанная информация ему не нужна. Как только это произойдет, ресурсы, которые использовал процесс, освободятся.
- Что произойдет, если родительский процесс завершится раньше дочернего?
В этом сценарии система переназначит дочерний процесс другому родительскому процессу. Это может быть init или любой другой процесс.
Отправка сигналов процессам в Linux
Вы можете заставить определенный процесс ответить вам, отправив сигнал. Сигналы помогают вам взаимодействовать с операционной системой. Вы можете использовать сигнал, чтобы заставить приложение завершить работу, запуститься или изменить определенное поведение или задачу.
- Использование PID для отправки сигналов
Одной из утилит, которые вы можете использовать для отправки сигналов в Linux, является kill. Эта команда, как следует из ее названия, помогает вам завершить или «убить» процесс:
|
1 |
kill PIDoftarget_process |
Эта утилита отправляет процессу сигнал TERM, который указывает ему завершить работу. Команда заставляет приложение выполнить очику и корректно завершить работу. Если программа не завершает работу должным образом по сигналу TERM, вы можете пойти в обход, напрямую отправив сигнал KILL:
|
1 |
kill -KILL PIDoftarget_process |
Этот сигнал идет не программе. Он идет ядру операционной системы. Ядро напрямую завершит работу процесса. Вы можете использовать это, когда программа игнорирует отправляемые ей сигналы.
В этой команде вы также можете заменить имя сигнала связанным с ним номером. Например, вы можете использовать «-15» вместо «-TERM». Точно так же вы можете заменить «-KILL» на «-9».
- Использование сигналов для различных целей
Вы можете использовать сигналы не только для уничтожения или завершения программ, но и для других целей. Например, одной из проблем может быть перезапуск демонов. Каждый раз, когда демон получает сигнал отбоя (HUP), он перезапускается в таких программах, как Apache. Чтобы переопределить это, вы можете использовать следующий сигнал:
|
1 |
sudo kill -HUP pidofapache |
Эта команда заставит Apache перезагрузить свою конфигурацию. В результате он продолжит предоставлять вам соответствующий контент.
Если вы хотите посмотреть, какие сигналы можно отправить с помощью утилиты kill, используйте следующую команду:
|
1 |
kill -l |

- Отправка сигналов по имени
Традиционно сигнал отправляется с использованием PID программы. Однако у вас есть возможность отправлять сигналы, используя обычное имя процесса. Для этого вы можете использовать команду pkill. Она работает аналогично тому, как работает команда pkill. Единственное отличие заключается в том, что она позволяет использовать имя процесса:
|
1 |
pkill -9 ping |
Эта команда pkill эквивалентна следующей команде kill:
|
1 |
kill -9 `pgrep ping` |
Также у вас есть команда на случай, если вы хотите отправить сигнал каждому экземпляру, а не конкретному процессу. Следующая команда отправит сигнал TERM всем запущенным в системе экземплярам Firefox:
|
1 |
killall firefox |
Настройка приоритетов процессов
Еще одна вещь, которую вы можете делать с помощью команд Linux, — это настраивать приоритеты. Это означает, что вы можете решать, какой процесс имеет приоритет в вашей серверной среде. Некоторые процессы вы можете считать критически важными. Другие могут быть не столь необходимы. Система будет выполнять последние программы только тогда, когда останутся свободные ресурсы.
Вы можете управлять приоритетом процессов в Linux с помощью команды niceness. Это значение обозначает высокоприоритетные задачи как менее «любезные» (less nice), а низкоприоритетные процессы — как более «любезные» (more nice). Думайте об этом так: высокоприоритетные процессы менее любезны, потому что они забирают себе все ресурсы. Низкоприоритетные задачи делятся ими, поэтому они более любезны.
Вы можете увидеть значение nice для конкретного процесса при запуске команды top. Это значение находится в столбце «NI». Высокоприоритетные задачи будут иметь значения nice в диапазоне от «-19/-20». Низкоприоритетные процессы находятся в диапазоне от «19/20». Вы увидите что-то вроде этого:
|
1 |
top |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
Задачи: 56 всего, 1 выполняется, 55 ожидает, 0 остановлено, 0 зомби 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 всего, 324496k использовано, 695104k свободно, 8512k буферы Swap: 0k всего, 0k использовано, 0k свободно, 264812k кэшировано 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, вам просто нужно использовать команду nice:
|
1 |
nice -n 15 commandtoexecute |
Эта команда будет работать только при запуске указанной программы. Если вы хотите изменить значение nice для уже запущенной программы, вам нужно использовать renice:
|
1 |
renice 0 PIDtoprioritize |
Заключение
Как видите, представленные здесь инструменты сильно отличаются от графических. В результате новичку может быть трудно их понять. Это руководство поможет вам ознакомиться с командами. Больше практики поможет вам лучше их освоить и использовать более эффективно.
Ознакомьтесь с другими нашими ресурсами, которые помогут вам лучше управлять серверами Linux, включая руководства по настройке сервера Linux для использования аутентификации на основе SSH-ключей, поиску файлов в системе Linux VPS с помощью whereis, which, whatis, readlink и find, и чтению и установке переменных окружения и оболочки на Linux VPS.
Приятной работы!
Комментарии
Комментариев пока нет. Будьте первым.