1 В избранное 0 Ответвления 0

OSCHINA-MIRROR/wizardforcel-llthw-zh

Присоединиться к Gitlife
Откройте для себя и примите участие в публичных проектах с открытым исходным кодом с участием более 10 миллионов разработчиков. Приватные репозитории также полностью бесплатны :)
Присоединиться бесплатно
Клонировать/Скачать
ex16.md 13 КБ
Копировать Редактировать Web IDE Исходные данные Просмотреть построчно История
gitlife-traslator Отправлено 25.11.2024 03:02 8398775

Процессы: работа с процессами, ps, kill

Перевод:

Самый простой вид программы — это файл на жёстком диске, который содержит инструкции для выполнения центральным процессором. Когда вы запускаете программу, она копируется в память, и управление передаётся ей. Программа, которая выполняется, называется процессом. В многозадачной операционной системе, такой как Linux, вы можете запускать несколько экземпляров программы, поэтому от одной программы может быть запущено несколько процессов, все программы будут работать одновременно (выполняться).

Вот обзор того, что происходит при выполнении команды ls:

  1. Вы вводите команду ls и её аргументы в свой терминал-эмулятор, а затем нажимаете клавишу <ENTER>.
  2. Управление передаётся Bash.
  3. Bash ищет ls на вашем жёстком диске.
  4. Он клонирует себя в новое место в памяти.
  5. Он становится родительским процессом для своего клона Bash.
  6. Управление передаётся клону Bash.
  7. Клон Bash становится дочерним процессом Bash.
  8. Сохраняет среду родительского процесса Bash.
  9. Знает, что он является клоном, и реагирует соответствующим образом. Использует ls, чтобы перезаписать себя.
  10. Управление теперь передаётся ls.
  11. ls печатает список каталогов или возвращает ошибку.
  12. Возвращает код выхода.
  13. Управление теперь возвращается Bash.
  14. Bash присваивает код выхода переменной ?.
  15. Ожидает вашего ввода.

Некоторые процессы не взаимодействуют так, как 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 )

Вы можете оставить комментарий после Вход в систему

1
https://api.gitlife.ru/oschina-mirror/wizardforcel-llthw-zh.git
git@api.gitlife.ru:oschina-mirror/wizardforcel-llthw-zh.git
oschina-mirror
wizardforcel-llthw-zh
wizardforcel-llthw-zh
master