Предыстория:
Установил как-то для дочери 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
Как использовать:
- Сохраните скрипт в файл, например,
kill_process.sh - Сделайте его исполняемым:
chmod +x kill_process.sh - Запустите, указав имя процесса:
./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означает успешное выполнение. - В зависимости от результата выводится сообщение об успехе или ошибке.
Важные нюансы:
-
pgrep -fможет найти больше процессов, чем ожидается (например, если имя частично совпадает).
Если нужно точное совпадение, используйтеpgrep -x(но это сработает только для имени исполняемого файла, напримерfirefox, а неfirefox-esr). -
kill -9крайняя мера. Лучше сначала попробоватьkill -15(SIGTERM), который позволяет процессу корректно завершиться. - Для работы скрипта требуются права на завершение процессов (обычно — запуск от того же пользователя или
sudo).







