Упражнение. Завершение неправильно функционирующего процесса

Завершено

Компьютеры неидеальны. Рано или поздно что-нибудь пойдет не так. Вот почему так важна работа системного администратора — он должен находить и устранять системные проблемы.

Допустим, что приложение Python вызывает проблемы. Возможно, это занимает слишком много времени ЦП, или, возможно, он перестал отвечать. В любом случае вы хотите остановить это приложение. Чтобы определить процесс или приложение, можно использовать команды ps и grep. Затем можно остановить его с помощью команды kill. Давайте попробуем сделать это на вашей виртуальной машине Linux.

Запуск неправильно функционирующего процесса

Если вы собираетесь завершить процесс, вам нужен процесс, который необходимо завершить. Давайте создадим такой процесс.

  1. Вернитесь в домашний каталог, введя следующую команду:

    cd ~
    
  2. В Azure Cloud Shell введите следующую команду, чтобы запустить редактор Linux vi:

    vi bad.py
    

    vi — широко распространенный текстовый редактор, унаследованный Linux от Unix. Хотите вы этого или нет, но пользователь Bash должен знать основы vi.

  3. Нажмите клавишу i, чтобы перевести vi в режим вставки. Затем введите следующую программу Python:

    i = 0
    while i == 0:
        pass
    

    Эта программа при ее запуске выполняется в бесконечном цикле — и, конечно, вы не захотите, чтобы она работала на вашем сервере.

  4. Нажмите клавишу Esc, чтобы выйти из режима вставки. Затем введите следующую команду и нажмите клавишу ВВОД, чтобы сохранить программу и выйти из редактора vi:

    :wq
    

    Не забудьте добавить двоеточие в начало команды. Что касается самой команды, то w означает "write" (записать), а q означает "quit" (выйти).

  5. Теперь с помощью следующей команды запустите программу, чтобы она выполнялась в фоновом режиме:

    python3 bad.py &
    

    Не забудьте указать амперсанд (&) в конце команды. Иначе вы не вернетесь в командную строку Bash. В Bash амперсанд выполняет команду и возвращает вас в командную строку, даже если команда не завершила выполнение.

Хотя это не бросается в глаза, но bad.py теперь работает в фоновом режиме и отбирает циклы ЦП у других процессов. Давайте внимательнее взглянем на то, что происходит.

Завершение процесса

Для завершения процесса необходимо имя или идентификатор процесса. Для этого служит команда ps.

  1. Для обновления памяти команда 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
    
  2. Из этого листинга видно, что bad.py потребляет 99 процентов времени ЦП сервера. Программа оправдывает свое название.

    Команда kill завершает выполняющийся процесс по его идентификатору. (Связанная команда с именем killall убивает процесс на основе имени процесса.) При вызове killнеобходимо решить, какой "сигнал" следует использовать для убийства процесса. Список типов сигналов можно отобразить с помощью следующей команды:

    kill -l
    
  3. Если вы завершаете процесс управляющей программы, который работает в фоновом режиме и предоставляет жизненно важные службы для операционной системы, то, возможно, придется завершить и сразу же перезапустить его. Для этого можно использовать сигнал SIGHUP.

    В данном примере требуется завершить процесс без его перезапуска. Поэтому вам нужно использовать сигнал SIGKILL, который соответствует номеру 9. Для этого извлеките идентификатор процесса bad.py из выходных данных ps -ef (во втором столбце) и завершите процесс с помощью следующей команды. Замените PROCESS_ID на идентификатор процесса.

    kill -9 PROCESS_ID
    

    Эту же команду можно также ввести в виде kill -s SIGKILL PROCESS_ID. Использовать имя или номер сигнала — на ваше усмотрение.

  4. В завершение снова выполните ps, чтобы убедиться, что bad.py больше не работает.

Команды ps и kill также часто используются для выявления и завершения "процессов-зомби" — дочерних процессов, которые оставляют плохо написанные программы.