Bash-скрипт для завершения процесса по имени:

Предыстория:

Установил как-то для дочери Krita (растровый графический редактор) просто порисовать. Не знаю, чем я руководствовался, хватило бы и Tux Paint, но как есть, так есть. Однако на моём ноуте в Linux Mint программа дико подвисала. К слову, почему так происходит, я так и не понял. Собственно, суть в том, что родилась идея простого скрипта для завершения процесса по имени. Ничего особенного, но вдруг кому пригодится.

#!/bin/bash

# Проверяем, передан ли аргумент с именем процесса
if [ -z "$1" ]; then
    echo "Использование: $0 <имя_процесса>"
    exit 1
fi

PROCESS_NAME=$1

# Ищем PID процессов с указанным именем
PIDS=$(pgrep -f "$PROCESS_NAME")

if [ -z "$PIDS" ]; then
    echo "Процесс '$PROCESS_NAME' не найден"
    exit 1
else
    echo "Найденные процессы '$PROCESS_NAME' с PID: $PIDS"
    
    # Завершаем каждый найденный процесс
    for PID in $PIDS; do
        echo "Завершаем процесс с PID $PID"
        kill -9 "$PID"
        
        if [ $? -eq 0 ]; then
            echo "Процесс $PID успешно завершен"
        else
            echo "Не удалось завершить процесс $PID"
        fi
    done
fi

Как использовать:

  1. Сохраните скрипт в файл, например, kill_process.sh
  2. Сделайте его исполняемым: chmod +x kill_process.sh
  3. Запустите, указав имя процесса: ./kill_process.sh имя_процесса

Особенности:

  • Использует pgrep для поиска процессов по имени
  • Завершает все процессы с совпадающим именем
  • Использует сигнал -9 (SIGKILL) для принудительного завершения
  • Выводит информацию о каждом завершаемом процессе

Если вы хотите более «мягкое» завершение, замените kill -9 на kill -15 (SIGTERM).

Вот подробное пояснение к каждой части скрипта:

#!/bin/bash

Шебанг — указывает, что скрипт должен выполняться в интерпретаторе Bash.

if [ -z "$1" ]; then
    echo "Использование: $0 <имя_процесса>"
    exit 1
fi

Проверка аргумента

  • [ -z "$1" ] проверяет, передан ли аргумент (имя процесса).
  • Если аргумента нет ($1 пуст), выводится сообщение о правильном использовании скрипта ($0 — имя самого скрипта).
  • exit 1  завершает скрипт с кодом ошибки (1 означает ошибку).
PROCESS_NAME=$1

Сохранение аргумента в переменную
Присваивает первый переданный аргумент ($1) переменной PROCESS_NAME для удобства.

PIDS=$(pgrep -f "$PROCESS_NAME")

Поиск процессов по имени

  • pgrep -f ищет процессы, в командной строке которых встречается $PROCESS_NAME.
  • -f означает поиск по полной командной строке (а не только по имени исполняемого файла).
  • Результат (список PID) сохраняется в переменную PIDS.
if [ -z "$PIDS" ]; then
    echo "Процесс '$PROCESS_NAME' не найден"
    exit 1

Проверка найденных процессов

  • [ -z "$PIDS" ]  проверяет, пуста ли переменная PIDS.
  • Если процессов не найдено, выводится сообщение, и скрипт завершается с ошибкой (exit 1).
else
    echo "Найденные процессы '$PROCESS_NAME' с PID: $PIDS"

Вывод информации о процессах
Если процессы найдены, скрипт выводит их PID для наглядности.

for PID in $PIDS; do
    echo "Завершаем процесс с PID $PID"
    kill -9 "$PID"

Завершение каждого процесса

  • Цикл for перебирает все PID из списка PIDS.
  • kill -9 отправляет сигнал SIGKILL (принудительное завершение) процессу с указанным PID.
    if [ $? -eq 0 ]; then
        echo "Процесс $PID успешно завершен"
    else
        echo "Не удалось завершить процесс $PID"
    fi
done

Проверка результата

  • $? код возврата последней команды (kill).
  • -eq 0 означает успешное выполнение.
  • В зависимости от результата выводится сообщение об успехе или ошибке.

Важные нюансы:

  1. pgrep -f может найти больше процессов, чем ожидается (например, если имя частично совпадает).
    Если нужно точное совпадение, используйте pgrep -x (но это сработает только для имени исполняемого файла, например firefox, а не firefox-esr).
  2. kill -9  крайняя мера. Лучше сначала попробовать kill -15 (SIGTERM), который позволяет процессу корректно завершиться.
  3. Для работы скрипта требуются права на завершение процессов (обычно — запуск от того же пользователя или sudo).

Menu