Процессы: работа с процессами, ps
, kill
Перевод:
Самый простой вид программы — это файл на жёстком диске, который содержит инструкции для выполнения центральным процессором. Когда вы запускаете программу, она копируется в память, и управление передаётся ей. Программа, которая выполняется, называется процессом. В многозадачной операционной системе, такой как Linux, вы можете запускать несколько экземпляров программы, поэтому от одной программы может быть запущено несколько процессов, все программы будут работать одновременно (выполняться).
Вот обзор того, что происходит при выполнении команды ls
:
ls
и её аргументы в свой терминал-эмулятор, а затем нажимаете клавишу <ENTER>
.ls
на вашем жёстком диске.ls
, чтобы перезаписать себя.ls
.ls
печатает список каталогов или возвращает ошибку.?
.Некоторые процессы не взаимодействуют так, как ls
, а просто работают в фоновом режиме, например ssh
. У процессов есть множество возможных состояний, и существует множество операций, которые можно выполнять над ними с помощью механизма сигналов.
Сначала давайте поговорим о состояниях. Если вы введёте команду ps ax -forest
, она выведет список всех процессов. Вы получите что-то вроде этого (пропуская некоторые процессы, связанные с оборудованием):
user1@vm1:/etc$ ps --forest ax
PID TTY STAT TIME COMMAND
1 ? Ss 0:16 init [2]
297 ? S<s 0:00 udevd --daemon
392 ? S< 0:00 \_ udevd --daemon
399 ? S< 0:00 \_ udevd --daemon
691 ? Ss 0:00 /sbin/portmap
703 ? Ss 0:00 /sbin/rpc.statd
862 ? Sl 0:00 /usr/sbin/rsyslogd -c4
886 ? Ss 0:00 /usr/sbin/atd
971 ? Ss 0:00 /usr/sbin/acpid
978 ? Ss 0:01 /usr/sbin/cron
1177 ? Ss 0:00 /usr/sbin/sshd
6671 ? Ss 0:00 \_ sshd: user1 [priv]
6675 ? S 0:00 \_ sshd: user1@pts/0
6676 pts/0 Ss 0:00 \_ -bash
7932 pts/0 R+ 0:00 \_ ps --forest ax
1191 ? Ss 0:00 /usr/sbin/exim4 -bd -q30m
1210 tty2 Ss+ 0:00 /sbin/getty 38400 tty2
1211 tty3 Ss+ 0:00 /sbin/getty 38400 tty3
1212 tty4 Ss+ 0:00 /sbin/getty 38400 tty4
1213 tty5 Ss+ 0:00 /sbin/getty 38400 tty5
1214 tty6 Ss+ 0:00 /sbin/getty 38400 tty6
6216 tty1 Ss+ 0:00 /sbin/getty 38400 tty1
Давайте рассмотрим этот список:
PID
— идентификатор процесса. Каждый процесс имеет уникальный номер, связанный с ним, который используется для уникальной идентификации процесса. Это означает, что два процесса не могут иметь одинаковый PID.TTY
— терминал, связанный с процессом, который позволяет процессу обмениваться информацией с вами.STAT
— текущее состояние процесса. Это будет подробно описано ниже.TIME
— время, проведённое в CPU (в минутах).COMMAND
— имя программы с параметрами. Обратите внимание, что /usr/sbin/sshd
является родительским процессом sshd: user1
, а sshd: user1
является родительским процессом sshd: user1@pts/0
, а sshd: user1@pts/0
является родительским процессом -bash
, а -bash
является родительским процессом ps –forest ax
. Вам нужно копнуть глубже!Теперь давайте обсудим возможные состояния процесса. Вы можете обратиться к man ps
за КОДАМИ СОСТОЯНИЯ ПРОЦЕССОВ.
Состояние | Описание |
---|---|
D | Непрерываемый сон (обычно IO). Процесс занят или приостановлен, не отвечает на сигналы, например, если диск уже вышел из строя, операция чтения не может завершиться. |
R | Выполняется или может выполняться (находится в очереди выполнения). |
S | Прерывистый сон (ожидание завершения события). Например, терминальные процессы и Bash обычно находятся в этом состоянии, ожидая, пока вы введете что-нибудь. |
T | Остановлен, либо задачей управления сигналом, либо из-за отслеживания. |
W | Разбиение на страницы (недействителен с версии 2.6.xx ядра, поэтому не беспокойтесь об этом). |
X | Мёртв (вы не должны его видеть). |
Z | Остановленный («зомби») процесс, уже завершённый, но ещё не возвращённый родительским элементом. Это происходит на ошибочно завершённых процессах. |
< | Высокий приоритет (плохо для других пользователей). |
N | Низкий приоритет (хорошо для других пользователей). |
L | Блокировка страниц в памяти (используется для реального времени и пользовательского ввода-вывода). |
s | Является лидером сеанса. Процессы Linux рассматриваются как единое целое и имеют общий идентификатор сеанса (SID). Если идентификатор процесса (PID) = идентификатор сеанса (SID), то этот процесс будет лидером сеанса. |
L | Многопоточный (использует CLONE_THREAD, например NPTL pthreads). |
+ | Находится в группе процессов переднего плана. Такие процессы позволяют вводить и выводить данные на терминал (tty). |
Теперь давайте поговорим о том, как общаться со всеми этими процессами. Вы можете сделать это, отправив сигнал. Сигнал может быть способом побудить процесс к действию, чтобы он вас слушал и делал то, что вы хотите. Вот сокращённый список возможных процессов, который я получил из раздела «СИГНАЛЫ» в man kill
:
| Сигнал | Номер | Действие | Описание |
| 0 | 0 | N/A | Указывает, можно ли отправить сигнал |
| HUP | 1 | Завершение | Управление терминалом приостановлено или родительский процесс умер |
| INT | 2 | Завершение | Из-за прерывания клавиатуры |
| QUIT | 3 | Ядро | Из-за выхода клавиатуры |
| ILL | 4 | Ядро | Недопустимая инструкция |
| TRAP | 5 | Ядро | Отслеживание/точка останова захвата |
| ABRT | 6 | Ядро | Остановка из-за abort(3)
|
| FPE | 8 | Ядро | Исключение с плавающей запятой |
| KILL | 9 | Завершение | Неуловимый и неустранимый сигнал уничтожения |
| SEGV | 11 | Ядро | Ссылка на недопустимую память |
| PIPE | 13 | Завершение | Повреждённая труба: запись в трубу без читателя |
| ALRM | 14 | Завершение | Сигнал таймера из alarm(2)
|
| TERM | 15 | Завершение | Прекращение процесса |
Также обратите внимание на abort(3)
и alarm(2)
. Это означает, что вы можете прочитать соответствующие страницы руководства, введя man 3 abort
и man 2 alarm
.
Теперь вы узнаете, как перечислить запущенные процессы и отправить им сигнал.
1: ps x
2: ps a
3: ps ax
4: ps axue --forest
5: dd if=/dev/zero of=~/test.img bs=1 count=$((1024*1024*1024)) &
6: kill -s USR1 $!
7: <ENTER>
8: kill -s USR1 $!
9: <ENTER>
10: kill -s TERM $!
11: <ENTER>
user1@vm1:/etc$ ps x
PID TTY STAT TIME COMMAND
6675 ? S 0:00
``` **Печать процессов, которые вы запустили**
1. Выведите на экран процессы, связанные с терминалом (`tty`), и процессы, которые вы запустили.
1. Отобразите все запущенные процессы.
1. Распечатайте дерево всех запущенных процессов с дополнительной информацией, такой как доступные имена пользователей и окружение. Обратите внимание, что эта информация относится только к процессам, которые вы запустили. Чтобы просмотреть информацию об окружении для всех процессов, введите `sudo ps axue -forest`.
1. Создайте пустой файл (заполните его пустыми символами, сейчас не обращайте на это внимания) и отправьте его в фоновый режим, указав `&` в конце.
1. Проверьте состояние `dd`.
1. Поскольку bash может выводить только некоторые данные в ответ на ваш ввод, вам нужно нажать `<ENTER>` (ввести пустую команду).
1. Ещё раз проверьте состояние `dd`.
1. Опять же, чтобы увидеть вывод, нажмите `<ENTER>`, чтобы ввести пустую команду.
1. Отправьте сигнал завершения `dd`, чтобы он завершился.
1. Чтобы убедиться, что это действительно произошло, снова нажмите `<ENTER>`.
## Дополнительное задание
+ Прочитайте `man ps` и `man kill`.
+ Изучите статью о жизненном цикле процесса (http://www.linux-tutorial.info/modules.php?name=MContent&pageid=84) и рассмотрите изображение рабочего процесса процесса (http://www.linux-tutorial.info/Linux_Tutorial/The_Operating_System/The_Kernel/Processes/procflowa.gif).
+ Распечатайте и заполните таблицу сигналов (https://nixsrv.com/llthw/ex16/signals). Вы можете использовать документацию на сайте kernel.org (http://www.kernel.org/doc/man-pages/online/pages/man7/signal.7.html#DESCRIPTION).
Вы можете оставить комментарий после Вход в систему
Неприемлемый контент может быть отображен здесь и не будет показан на странице. Вы можете проверить и изменить его с помощью соответствующей функции редактирования.
Если вы подтверждаете, что содержание не содержит непристойной лексики/перенаправления на рекламу/насилия/вульгарной порнографии/нарушений/пиратства/ложного/незначительного или незаконного контента, связанного с национальными законами и предписаниями, вы можете нажать «Отправить» для подачи апелляции, и мы обработаем ее как можно скорее.
Опубликовать ( 0 )