Упражнение. Завершение неправильно функционирующего процесса
Компьютеры неидеальны. Рано или поздно что-нибудь пойдет не так. Вот почему так важна работа системного администратора — он должен находить и устранять системные проблемы.
Допустим, что приложение Python вызывает проблемы. Возможно, это занимает слишком много времени ЦП, или, возможно, он перестал отвечать. В любом случае вы хотите остановить это приложение. Чтобы определить процесс или приложение, можно использовать команды ps
и grep
. Затем можно остановить его с помощью команды kill
. Давайте попробуем сделать это на вашей виртуальной машине Linux.
Запуск неправильно функционирующего процесса
Если вы собираетесь завершить процесс, вам нужен процесс, который необходимо завершить. Давайте создадим такой процесс.
Вернитесь в домашний каталог, введя следующую команду:
cd ~
В Azure Cloud Shell введите следующую команду, чтобы запустить редактор Linux
vi
:vi bad.py
vi
— широко распространенный текстовый редактор, унаследованный Linux от Unix. Хотите вы этого или нет, но пользователь Bash должен знать основыvi
.Нажмите клавишу i, чтобы перевести
vi
в режим вставки. Затем введите следующую программу Python:i = 0 while i == 0: pass
Эта программа при ее запуске выполняется в бесконечном цикле — и, конечно, вы не захотите, чтобы она работала на вашем сервере.
Нажмите клавишу Esc, чтобы выйти из режима вставки. Затем введите следующую команду и нажмите клавишу ВВОД, чтобы сохранить программу и выйти из редактора
vi
::wq
Не забудьте добавить двоеточие в начало команды. Что касается самой команды, то
w
означает "write" (записать), аq
означает "quit" (выйти).Теперь с помощью следующей команды запустите программу, чтобы она выполнялась в фоновом режиме:
python3 bad.py &
Не забудьте указать амперсанд (
&
) в конце команды. Иначе вы не вернетесь в командную строку Bash. В Bash амперсанд выполняет команду и возвращает вас в командную строку, даже если команда не завершила выполнение.
Хотя это не бросается в глаза, но bad.py теперь работает в фоновом режиме и отбирает циклы ЦП у других процессов. Давайте внимательнее взглянем на то, что происходит.
Завершение процесса
Для завершения процесса необходимо имя или идентификатор процесса. Для этого служит команда ps
.
Для обновления памяти команда
ps -ef
выводит список всех запущенных процессов и отображает большое количество сведений о каждом из них. Используйте следующую команду, чтобы вывести список всех запущенных процессов и отфильтровать результаты, оставив только строки, содержащие "python":ps -ef | grep python
Результат должен выглядеть примерно следующим образом:
yourname+ 342 254 99 23:34 pts/1 00:00:31 python3 bad.py yourname+ 344 254 0 23:35 pts/1 00:00:00 grep --color=auto python
Из этого листинга видно, что bad.py потребляет 99 процентов времени ЦП сервера. Программа оправдывает свое название.
Команда
kill
завершает выполняющийся процесс по его идентификатору. (Связанная команда с именемkillall
убивает процесс на основе имени процесса.) При вызовеkill
необходимо решить, какой "сигнал" следует использовать для убийства процесса. Список типов сигналов можно отобразить с помощью следующей команды:kill -l
Если вы завершаете процесс управляющей программы, который работает в фоновом режиме и предоставляет жизненно важные службы для операционной системы, то, возможно, придется завершить и сразу же перезапустить его. Для этого можно использовать сигнал
SIGHUP
.В данном примере требуется завершить процесс без его перезапуска. Поэтому вам нужно использовать сигнал
SIGKILL
, который соответствует номеру 9. Для этого извлеките идентификатор процесса bad.py из выходных данныхps -ef
(во втором столбце) и завершите процесс с помощью следующей команды. ЗаменитеPROCESS_ID
на идентификатор процесса.kill -9 PROCESS_ID
Эту же команду можно также ввести в виде
kill -s SIGKILL PROCESS_ID
. Использовать имя или номер сигнала — на ваше усмотрение.В завершение снова выполните
ps
, чтобы убедиться, что bad.py больше не работает.
Команды ps
и kill
также часто используются для выявления и завершения "процессов-зомби" — дочерних процессов, которые оставляют плохо написанные программы.