Урок курса

Управление процессами (jobs, ps, kill, nohup)

Bash Linux + Git: от новичка до уверенного пользователя

Управление процессами (jobs, ps, kill, nohup)

Когда ты запускаешь команду в терминале, она становится процессом – программой, выполняющейся в памяти. Уметь управлять процессами важно: иногда нужно запустить что-то в фоновом режиме, остановить зависшую программу или посмотреть, что вообще сейчас работает.

  • Фоновые задачи и jobs: Если после команды поставить &, она запустится в фоновом режиме (background). Например, long_task & – теперь терминал не будет ждать окончания long_task, а вернёт тебе управление сразу. Запущенная таким образом задача называется job. Командой jobs можно просмотреть список фоновых задач, запущенных в текущей сессии терминала (они будут пронумерованы как [1], [2], ...). Чтобы вернуть фоновый процесс на передний план (то есть снова начать с ним взаимодействовать напрямую), используй fg %номер_задачи (если задача одна, можно просто fg). А чтобы, наоборот, отправить активный процесс в фон, нажми Ctrl+Z (это поставит его на паузу), а потом введи bg – процесс продолжит выполняться, но уже в фоне.

  • ps: Эта команда выводит список процессов. Просто ps покажет процессы, связанные с твоим текущим терминалом. А ps aux (в BSD-стиле) или ps -ef (в UNIX-стиле) выведет список всех процессов в системе со множеством деталей: PID (идентификатор процесса), пользователь, процент использования памяти/CPU, и команду, которая запущена. Обычно этот список длинный, поэтому часто ps комбинируют с grep, чтобы найти конкретный процесс: например, ps aux | grep firefox выведет все процессы, связанные с Firefox.

  • kill: Несмотря на грозное название, команда kill не обязательно "убивает" процесс моментально (хотя может и это). kill отправляет сигнал процессу по его PID. По умолчанию это сигнал TERM (вежливая просьба завершиться). Узнав PID нужного процесса (из вывода ps или через jobs -l для фоновых), выполняем kill PID. Большинство программ поймёт сигнал TERM и корректно завершится. Если же процесс не реагирует (завис намертво), прибегают к kill -9 PID, посылая сигнал KILL – безусловное завершение процесса системой. Сигнал -9 сравнивают с "ликвидацией без предупреждения". Внимание: используя kill, всегда старайся отправлять обычный сигнал (без -9) сначала, чтобы дать программе шанс закрыть файлы и освободить ресурсы.

  • nohup: Если тебе нужно запустить длительный процесс, который должен пережить закрытие терминала или выход из системы, используй nohup (no hangup). Команда nohup myscript.sh & запустит скрипт в фоне, игнорируя сигнал SIGHUP (который посылается процессам при закрытии терминала). Вывод программы по умолчанию попадёт в файл nohup.out (раз уж консоли для вывода нет). Это удобно для запуска задач на сервере перед выходом из SSH-сессии, например.

Разбор команды ps

Что такое ps?

ps (от англ. process status) — это команда, используемая для получения снимка состояния запущенных процессов в системе. Она выводит список процессов, их идентификаторы, информацию о владельцах, используемых ресурсах (CPU, память) и другие детали. Команда ps незаменима при мониторинге, отладке и управлении процессами в Unix-подобных системах.

Основной синтаксис

ps [опции]
  • Если опции не указаны, ps выводит информацию о процессах, связанных с текущей сессией терминала.
  • Команда ps позволяет выбирать различные форматы вывода, чтобы отобразить нужные столбцы информации.

Распространённые опции

Опции в стиле System V

  • ps -ef
    Выводит все процессы в системе в «полном» формате:
    • UID – имя пользователя, запустившего процесс.
    • PID – идентификатор процесса.
    • PPID – идентификатор родительского процесса.
    • C – использование CPU.
    • STIME – время запуска процесса.
    • TTY – терминал, связанный с процессом.
    • TIME – общее процессорное время.
    • CMD – команда, запустившая процесс.

Опции в стиле BSD

  • ps aux
    Выводит все процессы, независимо от их управляющего терминала, с подробной информацией:
    • USER – имя пользователя.
    • PID – идентификатор процесса.
    • %CPU – процент использования CPU.
    • %MEM – процент использования памяти.
    • VSZ – виртуальный размер процесса (в КБ).
    • RSS – резидентный размер (физическая память).
    • TTY – терминал (если есть).
    • STAT – состояние процесса.
    • START – время запуска.
    • TIME – общее процессорное время.
    • COMMAND – команда, запустившая процесс.

Другие полезные опции

  • -e или -A
    Выводит все процессы в системе.
  • -u username
    Показывает процессы, запущенные от имени указанного пользователя.
  • -x
    Выводит процессы, не связанные с управляющим терминалом.
  • -o
    Позволяет задать пользовательский формат вывода, выбирая конкретные столбцы.

Примеры использования

Пример 1: Вывод всех процессов в системе

ps -e

Выведет список всех запущенных процессов.

Пример 2: Полный список процессов в стиле System V

ps -ef

Выведет подробную информацию обо всех процессах, включая UID, PID, PPID, время запуска и команду.

Пример 3: Вывод процессов в стиле BSD

ps aux

Выведет все процессы с информацией о пользователе, процентном использовании CPU и памяти, размере процессов, состоянии и т.д.

Пример 4: Фильтрация по пользователю

ps -u root

Покажет только процессы, запущенные от имени пользователя root.

Пример 5: Поиск процесса с использованием grep

ps aux | grep apache

Выведет все процессы, связанные с Apache, что удобно для мониторинга и отладки.

Полезные советы

  • Снимок состояния:
    ps показывает состояние процессов в момент выполнения команды. Для динамического мониторинга используйте утилиты типа top или htop.

  • Комбинирование с grep:
    Используйте конвейеры, чтобы фильтровать вывод. Например, ps -ef | grep ssh поможет найти все процессы, связанные с SSH.

  • Пользовательский формат:
    С опцией -o можно настроить вывод так, чтобы отображались только нужные столбцы, что упрощает анализ информации.

Разбор команды kill

Что такое kill?

kill — это команда, которая отправляет сигналы процессам, идентифицируемым по их PID (Process ID). Хотя название "kill" ассоциируется с прекращением работы процесса, команда может отправлять и другие сигналы, позволяющие, например, корректно завершить процесс, приостановить его выполнение, обновить настройки или выполнить другие действия.

Основной синтаксис

kill [опции] PID...
  • PID — идентификатор процесса (или процессов), которым отправляется сигнал.
  • Если указывается несколько PID, kill отправит сигнал каждому из них.

Основные сигналы

  • SIGTERM (15):
    Стандартный сигнал завершения, который вежливо просит процесс завершиться. Это сигнал по умолчанию.

    kill 1234 # Отправляет SIGTERM процессу с PID 1234
  • SIGKILL (9):
    Безусловное завершение процесса, которое не позволяет процессу выполнить очистку или сохранить данные. Этот сигнал используется, когда процесс не отвечает на SIGTERM.

    kill -9 1234
  • SIGHUP (1):
    Часто используется для перезагрузки процесса, чтобы он перечитал конфигурационные файлы.

    kill -1 1234
  • SIGSTOP, SIGCONT:
    Позволяют приостанавливать и возобновлять выполнение процесса.

    kill -STOP 1234 # Приостанавливает процесс kill -CONT 1234 # Возобновляет процесс

Основные опции

  • -s сигнал или --signal сигнал:
    Позволяет явно указать отправляемый сигнал, например, kill -s SIGKILL 1234.

  • -l:
    Показывает список доступных сигналов.

    kill -l
  • -q:
    Некоторые реализации поддерживают тихий режим, но это менее распространённо.

Примеры использования

Пример 1: Отправка сигнала SIGTERM (по умолчанию)

kill 1234

Эта команда отправляет сигнал SIGTERM процессу с PID 1234, предлагая ему завершиться корректно.

Пример 2: Принудительное завершение процесса с помощью SIGKILL

kill -9 1234

Если процесс не реагирует на SIGTERM, можно использовать SIGKILL для немедленного прекращения его работы.

Пример 3: Отправка сигнала SIGHUP для перезагрузки процесса

kill -1 1234

Это часто используется для перезагрузки процессов, чтобы они перечитали свои конфигурационные файлы.

Пример 4: Приостановка и возобновление процесса

kill -STOP 1234 # Приостановка процесса kill -CONT 1234 # Возобновление процесса

Полезные советы

  • Используйте SIGTERM по умолчанию:
    Прежде чем применять SIGKILL, рекомендуется сначала отправить SIGTERM, чтобы дать процессу шанс корректно завершиться.

  • Будьте осторожны с привилегиями:
    Для отправки сигналов процессам, запущенным другим пользователем, обычно требуются права суперпользователя (root).

  • Проверка PID:
    Убедитесь, что вы отправляете сигнал нужному процессу, используя команды типа ps, pgrep или top.

  • Список сигналов:
    Команда kill -l покажет все доступные сигналы и их номера, что полезно для быстрого справочника.

Разбор команды nohup

Что такое nohup?

nohup (от англ. no hangup) — это команда, которая позволяет запускать другую команду таким образом, чтобы она игнорировала сигнал HUP (hangup). Этот сигнал обычно посылается процессам при закрытии терминала или разрыве SSH-сессии. Использование nohup гарантирует, что запущенный процесс продолжит работу, даже если вы выйдете из системы.

Основной синтаксис

nohup команда [аргументы] [> вывод_файла 2>&1] &

  • команда [аргументы] — команда, которую вы хотите выполнить с nohup.
  • > вывод_файла 2>&1 — перенаправление стандартного вывода и стандартного потока ошибок в указанный файл (если не указано, вывод по умолчанию будет записываться в файл nohup.out).
  • & — амперсанд позволяет запустить команду в фоне, возвращая управление терминалом.

Примеры использования

Пример 1: Запуск скрипта в фоне

nohup ./myscript.sh > myscript.log 2>&1 &

  • Что происходит:
    Скрипт myscript.sh запускается в фоне, и все его вывод (как стандартный, так и ошибки) записывается в файл myscript.log. Даже если вы закроете терминал, скрипт продолжит работать.

Пример 2: Запуск длительной команды

nohup python long_running_script.py &

  • Что происходит:
    Длительный Python-скрипт запускается в фоне. Если не указать перенаправление вывода, стандартный вывод и ошибки будут записаны в файл nohup.out.

Пример 3: Просмотр файла nohup.out

Если вы не указали свой файл для вывода, можно посмотреть содержимое файла nohup.out:

less nohup.out

Полезные советы

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

    nohup some_command > output.log 2>&1 &

  • Фоновые процессы:
    Запуск команд с nohup часто сочетается с символом &, чтобы процесс выполнялся в фоне, освобождая терминал для других задач.

  • Проверка процессов:
    Используйте команды типа ps, pgrep или jobs для отслеживания запущенных процессов, если вы хотите убедиться, что процесс продолжает работать.

  • nohup.out:
    Если вывод не перенаправлен, по умолчанию он записывается в файл nohup.out в текущей директории. Убедитесь, что у вас есть права на запись в эту директорию.

Продолжить с сохранением прогресса

Перейдите к уроку в учебном кабинете.

Перейти к интерактивному уроку