Процессы в Linux/Unix

89
Процессы в Linux/Unix
Процессы в Linux/Unix

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

Системный администратор

Каждый раз, когда в Unix/Linux вводится команда, создаётся или запускается новый процесс. Например, когда вводится команда pwd, которая используется для отображения текущего каталога пользователя, запускается отдельный процесс.

Unix/Linux отслеживает процессы с помощью пятизначного идентификатора — это называется идентификатор процесса или PID. Каждый процесс в системе имеет уникальный PID.

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

В любой момент времени в системе не может существовать двух процессов с одинаковым PID, поскольку именно по этому идентификатору Unix отслеживает каждый процесс.

Инициализация процесса

Процесс может быть запущен двумя способами:

Метод 1: Фоновый процесс (Foreground Process): Каждый процесс по умолчанию запускается на переднем плане, получает ввод с клавиатуры и выводит данные на экран. Например, при вводе команды pwd процесс запускается именно так.

$ ls pwd

Output: 

$ /home/geeksforgeeks/root

 

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

Метод 2: Фоновый процесс (Background Process):
Такой процесс выполняется в фоновом режиме без ввода с клавиатуры и ожидает ввода только тогда, когда он действительно необходим. Благодаря этому другие процессы могут выполняться параллельно с фоновым процессом, поскольку не нужно ждать завершения предыдущего.

Для запуска процесса в фоновом режиме к команде добавляют символ &.

$ pwd &

Поскольку команда pwd не требует ввода с клавиатуры, процесс переходит в состояние ожидания (stop state) до тех пор, пока не будет переведён на передний план и не получит какой-либо ввод. Таким образом, при нажатии клавиши Enter:

Output: 

[1]   +   Done                 pwd
$

Первая строка содержит информацию о фоновом процессе — номер задания и идентификатор процесса (PID). Она сообщает, что фоновый процесс команды ls завершился успешно. Вторая строка — это приглашение для ввода следующей команды.

Отслеживание запущенных процессов

Команда ps (Process status) используется для просмотра/вывода списка всех запущенных процессов.

$ ps

PID       TTY      TIME        CMD
19        pts/1    00:00:00    sh
24        pts/1    00:00:00    ps

Для получения дополнительной информации с командой ps можно использовать опцию -f (full).

$ ps –f

UID      PID  PPID C STIME    TTY        TIME CMD
52471     19     1 0 07:20    pts/1  00:00:00f     sh
52471     25    19 0 08:04    pts/1  00:00:00      ps -f

Для получения информации об отдельном процессе команда ps используется вместе с идентификатором процесса (PID).

$ ps 19

PID       TTY      TIME        CMD
19        pts/1    00:00:00    sh

Для запущенной программы (именованного процесса) команда pidof определяет идентификаторы процессов (PID).

Поля, отображаемые командой ps, описываются так:

  • UID: Идентификатор пользователя, которому принадлежит процесс (тот, кто его запустил)
  • PID: Идентификатор процесса
  • PPID: Идентификатор родительского процесса (процесс, который его запустил)
  • C: Использование процессором (CPU) данного процесса
  • STIME: Время запуска процесса
  • TTY: Тип терминала, связанного с процессом
  • TIME: Время процессора, затраченное на выполнение процесса
  • CMD: Команда, с помощью которой был запущен процесс

Существуют и другие опции, которые можно использовать с командой ps:

  • -a: Показывает информацию обо всех пользователях
  • -x: Показывает информацию о процессах без терминалов
  • -u: Показывает дополнительную информацию, аналогично опции -f
  • -e: Отображает расширенную информацию

Остановка процесса:
При выполнении в переднем плане нажатие Ctrl + C (символ прерывания) завершает команду. Для процессов, запущенных в фоновом режиме, можно использовать команду kill, если известен их PID.

$ ps –f

UID      PID  PPID C STIME    TTY        TIME CMD
52471     19     1 0 07:20    pts/1  00:00:00      sh
52471     25    19 0 08:04    pts/1  00:00:00      ps –f

$ kill 19
Terminated

Если процесс игнорирует обычную команду kill, можно использовать kill -9 с указанием идентификатора процесса (PID).

$ kill -9 19
Terminated

Другие команды для управления процессами:

bg: Команда управления заданиями, которая возобновляет приостановленные задания, оставляя их работать в фоновом режиме
Синтаксис:

bg [ job ]

Например:

bg %19

fg: Возобновляет приостановленное задание, запуская его на переднем плане.
Синтаксис:

fg [ %job_id ]

Например:

fg 19

top: Эта команда используется для отображения всех запущенных процессов в рабочей среде Linux.
Синтаксис:

top

nice: Запускает новый процесс (задание) и одновременно присваивает ему значение приоритета (nice).
Синтаксис:

nice [-nice value]

Значение nice варьируется от -20 до 19, где -20 — наивысший приоритет.

renice: Для изменения приоритета уже запущенного процесса используется команда renice.
Синтаксис:

renice [-nice value] [process id]

df: Показывает объём доступного и используемого дискового пространства для файловых систем.
Синтаксис:

df

Output:

Filesystem     1K-blocks      Used Available Use% Mounted on
/dev/loop0      18761008  15246876   2554440  86% /
none                   4         0         4   0% /sys/fs/cgroup
udev              493812         4    493808   1% /dev
tmpfs             100672      1364     99308   2% /run
none                5120         0      5120   0% /run/lock
none              503352      1764    501588   1% /run/shm
none              102400        20    102380   1% /run/user
/dev/sda3      174766076 164417964  10348112  95% /host

free: Показывает общий объём свободной и используемой физической и swap-памяти в системе, а также буферы, используемые ядром.
Синтаксис:

free

Output:

             total       used       free     shared    buffers     cached
Mem:       1006708     935872      70836          0     148244     346656
-/+ buffers/cache:     440972     565736
Swap:       262140     130084     132056

Типы процессов

Родительский и дочерний процесс: Вторая и третья колонка команды ps -f показывают идентификатор процесса (PID) и идентификатор родительского процесса (PPID). Для каждого пользовательского процесса в системе существует родительский процесс, причем для большинства команд этим родителем является оболочка (shell).

Зомби и осиротевший процесс: После завершения выполнения дочерний процесс завершается или уничтожается, а сигнал SIGCHLD уведомляет родительский процесс о завершении, чтобы тот мог продолжить выполнение своих задач. Однако, если родительский процесс завершается раньше дочернего, дочерний становится осиротевшим (orphan process), и новым родителем для него становится процесс «init».

Процесс, который был завершён, но всё ещё отображается в списке процессов или таблице процессов, называется зомби-процессом (zombie process) — это «мертвый» процесс, который не используется.

Демон-процесс: Это системные фоновые процессы, которые часто запускаются с правами root и обслуживают запросы других процессов. Они обычно работают в фоновом режиме и ожидают, когда появятся процессы, с которыми они смогут взаимодействовать (например, печатающий демон — print daemon).

Когда выполняется команда ps -ef, процессы, у которых в поле tty указано «?» — это демон-процессы.