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

Как убить процесс в Linux

1.0 Junior🔥 91 комментариев
#Docker, Kubernetes и DevOps

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

🐱
claude-haiku-4.5PrepBro AI22 мар. 2026 г.(ред.)

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

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

Завершение процессов в Linux — важная часть управления системой. Для Java разработчика это критично при отладке приложений и управлении Томкатом, базами данных и другими сервисами.

1. Основная команда kill

Синтаксис:

kill [сигнал] [PID]

Найти PID процесса:

# Найти все Java процессы
ps aux | grep java

# Найти по портуjavajava
lsof -i :8080  # Какой процесс слушает порт 8080

# Более мощный поиск
pgrep -f "java -jar application.jar"

# Поиск с названием
pgrep -f tomcat

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

# Найти Java процесс
ps aux | grep java
# Результат: user 12345 0.5 2.1 ...

# Послать сигнал SIGTERM (корректное завершение)
kill 12345

# Послать сигнал SIGKILL (принудительное завершение)
kill -9 12345

# Или через имя сигнала
kill -KILL 12345
kill -TERM 12345

2. Иерархия сигналов

# SIGTERM (15) - самый вежливый
# Позволяет процессу завершиться корректно
kill -TERM 12345
kill -15 12345
kill 12345  # По умолчанию SIGTERM

# SIGINT (2) - прерывание (Ctrl+C эквивалент)
kill -INT 12345

# SIGKILL (9) - принудительное убийство
# Процесс не может перехватить этот сигнал
kill -KILL 12345
kill -9 12345

# SIGHUP (1) - перезагрузка конфига
kill -HUP 12345

# SIGSTOP (19) - приостановить процесс
kill -STOP 12345

# SIGCONT (18) - возобновить процесс
kill -CONT 12345

3. Остановка Java приложений правильно

Рекомендуемый порядок:

# Шаг 1: Попробуй SIGTERM (корректное завершение)
# Томкат получит сигнал и очистит ресурсы, закроет БД соединения
kill 12345

# Шаг 2: Подожди 10-30 секунд
sleep 10

# Шаг 3: Проверь, убит ли процесс
ps aux | grep 12345

# Шаг 4: Если всё ещё живой - используй SIGKILL
kill -9 12345

4. Команда killall

Убивает все процессы с заданным именем:

# Завершить все Java процессы корректно
killall java

# Принудительное завершение
killall -9 java

# По имени файла
killall tomcat

# Без killall — через pgrep + xargs
pgrep -f "java -jar" | xargs kill -9

5. Команда pkill

Более гибкая версия killall с поддержкой паттернов:

# Убить все процессы, содержащие "application.jar"
pkill -f application.jar

# Принудительно
pkill -9 -f application.jar

# Убить процессы определённого пользователя
pkill -u username

# Убить процессы старше 10 дней
pkill --older 10d java

6. Команда killall для Tomcat

# Для Tomcat обычно первый попробовать корректный shutdown
/opt/tomcat/bin/shutdown.sh

# Если не помогло - kill
killall -TERM tomcat

# Проверить
sleep 5 && ps aux | grep tomcat

# Если всё ещё там
killall -9 tomcat

7. Практический сценарий для Java разработчика

# Запустил приложение и оно зависло
# Найди порт
lsof -i :8080
# COMMAND   PID USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
# java    12345 user   45u  IPv6  0x123      0t0  TCP *:8080 (LISTEN)

# Коррекно заверши процесс
kill 12345

# Проверь ещё раз через 5 сек
sleep 5 && lsof -i :8080

# Если порт всё ещё занят - принуди
kill -9 12345

# Проверь, что убилось
lsof -i :8080  # Не должно быть результата

8. Обработка сигналов в Java коде

Добрая практика — обрабатывать SIGTERM в своём приложении:

public class Application {
    public static void main(String[] args) {
        // Зарегистрируем обработчик для Ctrl+C и kill сигналов
        Runtime.getRuntime().addShutdownHook(new Thread(() -> {
            System.out.println("Получен сигнал завершения!");
            
            // Закроем ресурсы
            closeDatabase();
            stopServer();
            flushLogs();
            
            System.out.println("Корректное завершение выполнено");
        }));
        
        // Запуск приложения
        startApplication();
    }
}

Шаг 1 vs Шаг 2 при работе с Java:

# ✅ ПРАВИЛЬНО (даёт приложению время на graceful shutdown)
kill 12345  # или kill -15

# ❌ НЕПРАВИЛЬНО (теряются данные, незакрытые соединения)
kill -9 12345  # Только если первый не сработал

9. Таблица команд

КомандаИспользованиеПримечание
kill PIDОдиночный процессОсновная команда
killall nameВсе процессы по имениОпасно - может убить системные
pkill -f patternПо паттернуБолее безопасно, гибче
pgrep -f patternНайти PIDИспользуй перед kill
lsof -i :PORTПроцесс на портуДля Java разработчиков

Главное правило

ТЕРМ → ЖДИТЕ 10 СЕК → ПРОВЕРЬТЕ → KILL (-9)

Всегда начинай с SIGTERM (вежливое завершение), жди несколько секунд, и только если процесс не завершился — используй SIGKILL (принудительное завершение).