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

LinuxLinuxBeginner
Практиковаться сейчас

💡 Этот учебник переведен с английского с помощью ИИ. Чтобы просмотреть оригинал, вы можете перейти на английский оригинал

Введение

В этом лабораторном занятии вы научитесь завершать процессы в Linux с помощью команд kill, killall и pkill. Эти команды являются важными для управления запущенными процессами и могут использоваться для остановки нереагирующих приложений или освобождения системных ресурсов.

По завершении этого лабораторного занятия вы сможете:

  • Использовать команду kill для завершения определенного процесса
  • Использовать команду killall для завершения нескольких процессов по имени
  • Использовать команду pkill в качестве альтернативы команде killall

Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL linux(("Linux")) -.-> linux/BasicSystemCommandsGroup(["Basic System Commands"]) linux(("Linux")) -.-> linux/TextProcessingGroup(["Text Processing"]) linux(("Linux")) -.-> linux/ProcessManagementandControlGroup(["Process Management and Control"]) linux(("Linux")) -.-> linux/SystemInformationandMonitoringGroup(["System Information and Monitoring"]) linux(("Linux")) -.-> linux/UserandGroupManagementGroup(["User and Group Management"]) linux/BasicSystemCommandsGroup -.-> linux/sleep("Execution Delaying") linux/TextProcessingGroup -.-> linux/grep("Pattern Searching") linux/ProcessManagementandControlGroup -.-> linux/kill("Process Terminating") linux/ProcessManagementandControlGroup -.-> linux/killall("Multi-Process Killing") linux/ProcessManagementandControlGroup -.-> linux/pkill("Pattern-Based Killing") linux/SystemInformationandMonitoringGroup -.-> linux/ps("Process Displaying") linux/UserandGroupManagementGroup -.-> linux/sudo("Privilege Granting") subgraph Lab Skills linux/sleep -.-> lab-44{{"Завершение процессов в Linux"}} linux/grep -.-> lab-44{{"Завершение процессов в Linux"}} linux/kill -.-> lab-44{{"Завершение процессов в Linux"}} linux/killall -.-> lab-44{{"Завершение процессов в Linux"}} linux/pkill -.-> lab-44{{"Завершение процессов в Linux"}} linux/ps -.-> lab-44{{"Завершение процессов в Linux"}} linux/sudo -.-> lab-44{{"Завершение процессов в Linux"}} end

Понимание идентификаторов процессов и сигналов

Перед тем, как мы начнем завершать процессы, важно понять два ключевых понятия: идентификаторы процессов (Process IDs, PID) и сигналы.

  1. Откройте терминал в своей виртуальной машине Ubuntu. По умолчанию вы должны находиться в директории /home/labex/project. Если вы не уверены, вы всегда можете проверить текущую директорию, введя pwd и нажав Enter.

  2. Начнем с запуска простого фонового процесса. Введите следующую команду:

    sleep 1000 &

    Эта команда запускает процесс, который будет "спать" в течение 1000 секунд и запускает его в фоновом режиме. Символ & в конце сообщает оболочке запустить команду в фоновом режиме, позволяя вам продолжать использовать терминал.

  3. Чтобы увидеть запущенные процессы, используйте команду ps:

    ps aux | grep sleep

    Эта команда показывает все запущенные процессы (ps aux), а затем фильтрует вывод, чтобы показать только строки, содержащие "sleep" (grep sleep).

    Вы должны увидеть вывод, похожий на следующий:

Terminal showing sleep process

Число во второй колонке - это идентификатор процесса (PID). Мы будем использовать его для завершения процесса позже.

  1. Linux использует сигналы для общения с процессами. Наиболее распространенные сигналы для завершения процессов:
    • SIGTERM (15): Грамотно завершить процесс. Это сигнал по умолчанию, отправляемый командой kill.
    • SIGKILL (9): Принудительно убить процесс. Этот сигнал следует использовать в качестве последнего средства, когда SIGTERM не работает.

Теперь, когда мы понимаем PID и сигналы, мы готовы перейти к использованию команды kill.

Использование команды kill

Команда kill используется для отправки сигнала определенному процессу, идентифицируемому по его PID. По умолчанию она отправляет сигнал SIGTERM, который просит процесс завершиться корректно.

  1. Завершим процесс sleep, который мы запустили ранее. Сначала найдем его PID с помощью команды ps:

    ps aux | grep sleep

    Запишите PID процесса sleep. Это будет число во второй колонке вывода.

  2. Теперь используйте команду kill для завершения процесса:

    kill <PID>

    Замените <PID> на фактический идентификатор процесса, который вы записали. Например, если PID равен 1234, вы должны ввести kill 1234.

  3. Проверьте, запущен ли процесс еще:

    ps aux | grep sleep

    В выводе больше не должно быть процесса sleep, за исключением самой команды grep.

Если процесс все еще запущен (что маловероятно для простой команды sleep, но возможно для более сложных приложений), вы можете использовать более сильный сигнал:

kill -9 <PID>
Terminating process with kill command

Эта команда отправляет сигнал SIGKILL, который принудительно завершает процесс. Будьте осторожны при использовании SIGKILL, так как он не позволяет процессу выполнить очистку, что может привести к потере данных или другим проблемам в более сложных приложениях.

Использование команды killall

Команда killall позволяет завершать процессы по имени, что может быть более удобно, чем использование PID, особенно когда запущено несколько экземпляров одной и той же программы.

  1. Запустите несколько процессов sleep:

    sleep 2000 &
    sleep 2000 &
    sleep 2000 &

    Эта команда запускает три отдельных процесса sleep, каждый из которых работает в фоновом режиме в течение 2000 секунд.

  2. Проверьте, что процессы запущены:

    ps aux | grep sleep

    Вы должны увидеть три процесса sleep в списке.

  3. Теперь используйте команду killall для завершения всех процессов sleep:

    sudo killall sleep

    Здесь мы используем sudo, так как killall может потребовать повышенных привилегий для завершения процессов, запущенных другими пользователями или системными процессами. Вам может быть предложено ввести ваш пароль.

  4. Проверьте, что процессы были завершены:

    ps aux | grep sleep

    В выводе больше не должно быть никаких процессов sleep, за исключением самой команды grep.

Если вы получаете ошибку "Operation not permitted", это означает, что у вас нет необходимых прав для завершения определенных процессов. В этом случае использование sudo, как показано выше, должно решить проблему.

Использование команды pkill

Команда pkill представляет собой еще один способ завершения процессов по имени, аналогичный команде killall. Она особенно полезна, когда вы хотите завершить процессы на основе частичного совпадения имен.

  1. Запустите еще несколько процессов sleep:

    sleep 3000 &
    sleep 3000 &
    sleep 3000 &

    Эта команда запускает еще три процесса sleep, каждый из которых работает в фоновом режиме в течение 3000 секунд.

  2. Используйте команду pkill для завершения этих процессов:

    sudo pkill sleep

    Как и с командой killall, мы используем sudo, чтобы убедиться, что у нас есть необходимые права для завершения всех соответствующих процессов.

  3. Проверьте, что процессы были завершены:

    ps aux | grep sleep

    В выводе не должно быть никаких процессов sleep, за исключением самой команды grep.

Основное различие между командами pkill и killall заключается в том, что pkill может находить совпадения по частичному имени процесса. Например, команда pkill fire завершит как процессы firefox, так и firebird. Это может быть как мощным, так и опасным средством, поэтому всегда проверяйте свои команды pkill перед их выполнением.

Практика с реальными приложениями

Теперь, когда вы узнали, как использовать команды kill, killall и pkill, давайте попрактикуемся на реальном приложении. В качестве примера мы будем использовать Firefox. Этот шаг практики нужно выполнять в десктопной среде.

Firefox process termination example
  1. Запустите веб - браузер Firefox:

    firefox &

    Эта команда запускает Firefox в фоновом режиме. Вы должны увидеть окно Firefox на рабочем столе.

  2. Используйте команду ps для поиска PID Firefox:

    ps aux | grep firefox

    Запишите PID основного процесса Firefox. Обычно это будет первый в списке процесс Firefox.

  3. Используйте команду kill для завершения работы Firefox:

    kill <PID>

    Замените <PID> на фактический идентификатор процесса Firefox, который вы записали.

  4. Если Firefox не закрывается (что возможно, так как некоторые приложения перехватывают сигнал SIGTERM), попробуйте использовать сигнал SIGKILL:

    kill -9 <PID>

    Помните, что SIGKILL следует использовать в качестве последнего средства, так как он не позволяет приложению сохранить свое состояние или корректно выполнить очистку.

  5. В качестве альтернативы вы можете использовать команды killall или pkill:

    sudo killall firefox

    или

    sudo pkill firefox

    Эти команды завершат все процессы Firefox сразу, что может быть более удобно, чем завершение процессов по одному.

Помните, что принудительное завершение работы приложений может привести к потере данных, поэтому всегда лучше закрывать приложения обычным способом, если это возможно. Эти команды следует использовать, когда приложение не реагирует на действия или когда вам нужно быстро освободить системные ресурсы.

Итог

Поздравляем! Вы успешно завершили этот практический урок по завершению процессов в Linux. Вы научились:

  1. Использовать команду kill для завершения определенного процесса по его PID.
  2. Использовать команду killall для завершения нескольких процессов по имени.
  3. Использовать команду pkill в качестве альтернативы killall.
  4. Применять эти команды как к простым фоновым процессам, так и к реальным приложениям.

Помните, что хотя эти команды являются мощными инструментами для управления процессами, используйте их с осторожностью. Завершение критических системных процессов может привести к нестабильности системы. Всегда проверяйте, какой процесс вы собираетесь завершить, прежде чем использовать эти команды.

По мере продолжения вашего пути в Linux вы обнаружите, что эти навыки управления процессами будут неоценимы для поддержания стабильной работы системы и устранения неполадок. Продолжайте практиковаться с этими командами, чтобы стать более уверенным в управлении процессами в Linux!