Программа или команда при запуске получает от системы специальный экземпляр — процесс. Этот экземпляр включает все сервисы и ресурсы, которые могут понадобиться процессу во время выполнения.
Каждый раз, когда в 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 указано «?» — это демон-процессы.