Процессы в Linux
Для того чтобы эффективно управлять своим компьютером, вы должны доскональ но изучить свой сервер и работающие на нем процессы. Это поможет быстро увидеть в системе какие-либо аномалии.
Процесс — это программа или ее потомок. При запуске программы создается новый процесс, в котором и работает код. Каждая программа функционирует с определенными правами. Сервисы, которые активизируются при старте системы, обла дают правами root или nobody (без прав). Программы, которые выполняются из командной строки, наделены правами запустившего их пользователя, если не указан SUID- или SGID-бит, при котором программа имеет права владельца.
Процессы могут работать в двух режимах: фоновом (background) и центральном (foreground). Центральный режим для каждого терминала имеет только один процесс. Например, запустив по команде man ls программу для просмотра помощи, вы не сможете выполнять другие команды, пока не выйдете из программы man. Если ни один центральный процесс в терминале не запущен, то им является интерпретатор команд.
Cмена режима
Фоновыми процессами являются все сервисы. Они выполняют свои действия параллельно с вашей работой. Но и вы можете запустить любую программу в фоновом режиме. Для этого достаточно после указания команды через пробел поставить знак &. Например, выполните сейчас следующую команду:man ls &
В ответ на это вы не увидите файла помощи, а на экране появится только строка:
[1] 2802
После этого терминал снова готов работать, потому что центральный процесс запустил команду man is в фоновом режиме и свободен для выполнения новых директив.
В квадратных скобках показан порядковый номер фонового процесса, который мы запустили. Номера будут последовательно увеличиваться. В нашем случае это первая команда, поэтомув квадратных скобках стоит единица. Номер фонового процесса формируется для каждого пользователя. Если войти в систему через второй терминал и запустить какой-либо фоновый процесс, то вы увидите примерно следующее:
[1] 2805
В квадратных скобках опять число 1, а вот следующее значение отличается от выведенного на первом терминале. Это PID (Process ID, идентификатор процесса) созданного процесса, который является уникальным для всех пользователей.
Чтобы узнать, какие процессы у вас запущены, выполните команду jobs. В ответ на это вы получите:
[1] + Stopped man ls
Здесь мы видим, что процесс с номером [1] загружен в память, и состояние команды man is — Stopped (остановлен).
Какой смысл в том, что мы отправили просмотр файла помощи в фоновый режим? Я не зря выбрал эту команду, потому что в этом есть резон. Вы в любой момент можете сделать фоновый режим основным. Для этого необходимо ввести команду fg %1, где число 1 указывает номер вашего процесса, который вы видели в квадратных скобках. Попробуйте сейчас выполнить эту команду, и перед вами откроетсязапущенная программа man, отображающая файл помощи по использованию команды Is.fg %1
Раз процесс можно сделать центральным, значит, можно поступить и наоборот. Чтобы вернуть процесс в фоновый режим, нажмите комбинацию клавиш *
Если в программе есть возможность выполнять системные команды, то вместо сочетания клавиш *bg %1
Остановка процессов
Чтобы прекратить работающий процесс, необходимо сделать его центральным и остановить штатными средствами. Чаще всего на экране есть подсказка, которая поможет выйти из программы. Если она отсутствует, то следует обратиться к документации ИЛИ просмотреть файл ПОМОЩИ, ВЫЗВаВ: man имя программы.
Сервисы могут работать только в фоне и не могут быть выведены на передний план. Для того чтобы их остановить, существуют специализированные команды, которые чаще всего имеют вид:имясервиса stop
Иногда процессы зависают. Да, такие ситуации бывают и в ОС Linux. Центральный процесс может быть снят с помощью комбинации клавиш *kill %n
Параметр n нужно заменить номером процесса. Например, чтобы завершить работу фоновой программы man, нужно выполнить:kill %1
Затем сразу же запустите команду jobs. Вы должны увидеть на экране сообщение типа:
[1] + Terminated man ls
После повторного вызова команды jobs программы man больше не будет.
Если вы хотите завершить работу процесса, который запущен не вами, но вы знаете его PID, то нужно выполнить команду:kill n
Знак процента в этом случае не нужен. Тогда команда kill ищет процесс, у которого PID равен указанному числу n, и посылает сигнал для завершения.
Просмотр процессов
С помощью команды jobs вы можете увидеть только запущенные вами процессы. Чтобы полюбопытствовать, чем в системе занимаются остальные пользователи, нужно выполнить команду ps.
Перед нами появится четыре колонки, которые показывают идентификатор процесса, терминал, на котором запущена программа, время работы и выполняемую команду.
Это далеко не полный список. Чтобы увидеть все процессы, необходимо выполнить команду ps с ключом -а. Но и это еще не будет весь перечень, потому что отобразятся только программы своего терминала. Если требуется полный список процессов, запущенных со всех терминалов, то нужно добавить ключ -х. Помимо этого, вы можете пожелать увидеть имя пользователя, под которым работает процесс, для этого добавьте ключ -u. В итоге исчерпывающую информацию можно получить, выполнив команду:ps -ахu
Результат работы будет таков:
Колонка Stat показывает состояние процесса. Здесь можно встретить следующие коды:
- s (Sleeping) — спящий, это нормальное состояние для сервисов, которые просы паются только на редкие запросы клиентов;
- r (Runnable) — исполняемый в текущий момент;
- т (Traced or Stopped) — в состоянии отладки или остановлен;
- z (Zombied) — зависший. Такие процессы можно смело «убивать»;
- w — не имеет резидентных страниц;
- < — обладает высоким приоритетом;
- N — имеет низкий приоритет.
Это основные состояния, которые вы можете увидеть у процессов в своей системе.
Если в колонке Tty стоит вопросительный знак, то это означает, что процесс запущен еще на этапе загрузки системы и не принадлежит какому-либо терминалу.
Здесь показан всего лишь небольшой фрагмент файла. В реально работающей системе процессов очень много, и даже при минимальном количестве запущенных сервисов может не хватить одного экрана для отображения их всех. Я люблю сохранять результат работы в текстовый файл, а потом спокойно изучать его в любом редакторе. Для этого я выполняю команду:ps -ахu >> ps.txt
Чтобы увидеть, чем в настоящий момент занимаются другие пользователи, можно выполнить команду w.w
Очень удобно определять по списку, когда пользователь вошел в систему (колонка login@ ) и что он делает в настоящее время (колонка what).
Посмотрите на столбцы Jcpu и Pcpu — по ним можно оценить загрузку системы. Если ваш компьютер начал работать слишком медленно, то эти столбцы покажут, какой процесс отнимает много процессорного времени.
Команда ps выводит статическую информацию. Для наблюдения за нагрузкой системы удобнее использовать команду top. Она отображает список процессов, отсортированный по убыванию в зависимости от нагрузки. Здесь вы мржете увидеть, какой сервис или программа отнимают драгоценные ресурсы и не дают нормально работать с компьютером.
«Зомби»: поиск и устранение
Итак, у меня скрипты работают в постоянном режиме и создают новые процессы (дочерние), которые выполняют какие-то работы. Иногда бывает так, что дочерний процесс завершил свою работу, а родительский не видит этого и считает, что дочерний все еще работает. В системе образуются как бы «зомби» — которые не видят, что «тело уже умерло», и продолжают «дышать» и использовать ресурсы.
У меня все родительские процессы записывают себя в журнал в основном скрипте. Я знаю их ID, но не знаю, какой именно из дочерних завис или превратился в «зомби». Команда ps далеко не всегда показывает правильно такие проблемы.
В таких случаях я выполняю команду:ps -al
Эта команда выводит подробную информацию о выполняющихся сейчас процессах:
Самыми важными здесь являются вторая и третья колонки: PID (process ID) и PPID (parent process ID). Во второй строке в колонке PPID записано 702. Это значит, что процесс в этой строке является дочерним для процесса с PID, равным 702. Этот процесс можно увидеть в первой строке. Третья строка является дочерней для второй. То есть третий процесс — самый низший в иерархии.
Когда процессов много, то сразу так иерархию построить не получится. В этом случае можно фильтровать вывод с помощью следующей команды:ps -al | grep ХХХ
Здесь вы видите две команды, разделенные вертикальной чертой. Первая команда слева:ps -al
показывает подробную информацию о всех процессах. Вторая:grep
фильтрует вывод. И при этом показывает на экране только те строки, в которых есть текст ххх. В качестве этого ххх нужно указать ID родительского процесса.
Таким путем я иду от родительского процесса к дочерним и ищу самый последний из них. Когда нахожу последний, его и «убиваю» командой kill. Если не помогает, то «убиваю» предпоследний. Очень часто «убийство» последнего процесса не по могает, потому что он обычно уже реально не работает, а просто висит как фантом. А вот когда я «убиваю» предпоследний, то это видит вся цепочка дерева иерархии процессов.