← Назад к вопросам

Что делает команда kill?

1.0 Junior🔥 241 комментариев
#Операционные системы и Linux

Комментарии (1)

🐱
deepseek-v3.2PrepBro AI7 апр. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Команда kill в Unix/Linux системах

Команда kill — это встроенная утилита командной строки в Unix-подобных операционных системах (Linux, macOS, BSD), предназначенная для отправки сигналов процессам. Её основная функция — не "убийство" процесса в буквальном смысле, а управление его поведением через отправку стандартизированных сигналов. По умолчанию, без указания конкретного сигнала, команда отправляет сигнал SIGTERM (сигнал номер 15), который запрашивает корректное завершение процесса.

Основной синтаксис и использование

Базовый формат команды:

kill [опции] <PID>

Где PID (Process ID) — уникальный числовой идентификатор процесса.

Чтобы послать конкретный сигнал, используется флаг -s или его короткая форма — номер сигнала или его имя с префиксом SIG:

kill -s SIGKILL 12345  # Отправка сигнала SIGKILL процессу с PID 12345
kill -9 12345           # Аналогично, -9 — это номер SIGKILL

Ключевые сигналы и их назначение

Команда kill может отправлять множество сигналов (полный список можно увидеть через kill -l). Наиболее важные для разработчика:

  1. SIGTERM (15)сигнал по умолчанию. Это "вежливый" запрос на завершение. Процесс получает уведомление и может:
    *   Корректно закрыть файлы и сетевые соединения.
    *   Сохранить состояние.
    *   Выполнить другую cleanup-Dлогику перед выходом.
    *   Проигнорировать сигнал или перехватить его (`signal handling`).

  1. SIGKILL (9)сигнал безусловного завершения. Это "жесткое убийство". Ядро ОС немедленно останавливает процесс, не давая ему возможности обработать сигнал или выполнить финализацию. Это может привести к потере данных или ресурсным утечкам, поэтому используется как крайняя мера, если процесс не реагирует на SIGTERM.

  2. SIGHUP (1)сигнал "завершения работы терминала". Часто используется для перезапуска демонов (например, nginx -s reload). Многие long-running процессы перечитывают свои конфигурационные файлы при получении SIGHUP.

  3. SIGINT (2)сигнал прерывания. Обычно отправляется сочетанием клавиш Ctrl+C в терминале. Аналогичен SIGTERM, но традиционно ассоциируется с интерактивным прерыванием.

  4. SIGSTOP (19) и SIGCONT (18) — сигналы для приостановки и возобновления выполнения процесса. Они не завершают процесс, а меняют его состояние.

Практические примеры для разработчика

  • Корректная остановка приложения:

    kill 54321  # Отправляет SIGTERM процессу с PID 54321
    
  • Принудительное завершение "зависшего" процесса:

    kill -9 54321  # Использовать только если kill без флагов не сработал
    
  • Перезагрузка конфигурации демона (например, собственного сервиса на Go):

    kill -s SIGHUP $(cat /var/run/myapp.pid)
    
  • Завершение всех процессов по имени (с помощью pkill):

    pkill -f my_go_binary  # pkill — более продвинутый родственник kill
    

Особенности и важные нюансы

  • Права доступа: Чтобы отправить сигнал процессу, пользователь должен иметь соответствующие права (обычно быть владельцем процесса или суперпользователем root).
  • PID 1: Процесс с PID 1 (обычно init или systemd) является особым. Ядро по-разному обрабатывает для него некоторые сигналы (например, SIGKILL часто игнорируется), чтобы предотвратить случайную остановку всей системы.
  • В Go-приложениях: Перехватить и обработать сигналы можно через пакет os/signal. Это критически важно для graceful shutdown серверов.
    package main
    
    import (
        "fmt"
        "os"
        "os/signal"
        "syscall"
    )
    
    func main() {
        sigChan := make(chan os.Signal, til)
        signal.Notify(sigChan, syscall.SIGTERM, syscall.SIGINT)
    
        go func() {
            sig := <-sigChan
            fmt.Printf("Получен сигнал: %v. Начинаем graceful shutdown...\n", sig)
            // Закрываем соединения с БД, HTTP-eрвер и т.д.
            os.Exit(0)
        }()
    
        // Основная логика приложения
        select {}
    }
    

Разница между kill, pkill и killall

  • kill — работает только с PID.
  • pkill — позволяет выбирать процессы по имени или другим атрибутам (например, pkill -u username).
  • killall — похож на pkill, но в некоторых дистрибутивах завершает все процессы с заданным именем (ведет себя более агрессивно).

Вывод: Команда kill — это не просто инструмент "убийства", а точный инструмент межпроцессного взаимодействия (IPC). Понимание различий между SIGTERM и SIGKILL является базовой компетенцией любого системного или backend-разработчика, особенно при работе над отказоустойчивостью и graceful shutdown сервисов, написанных на Go.

Что делает команда kill? | PrepBro