Как убить, перезапустить программу в #Linux

Серия Linux

# plank restart

sleep 35s # ожидаем запуск

kill -9 $(pidof plank) # убиваем процесс по айди

# kill -1 $(`ps -A | grep -w plank | awk '{ print $1}'`)

sleep 2s # ждём завершения kill

plank

#где plank имя программы. если нет такой, попробуй на блокноте или калькуляторе.


предложите свои варианты в комментариях ?

GNU/Linux

1.2K постов15.6K подписчика

Правила сообщества

Все дистрибутивы хороши.

Будьте людьми.

Вы смотрите срез комментариев. Показать все
1
Автор поста оценил этот комментарий
Зачем сразу -9? Почему сначало не пробовать "вежливое" завершение процесса (Sigterm)?
раскрыть ветку (9)
0
Автор поста оценил этот комментарий

потому что нет надобности сохранить данные приложения.
и я не помню номер сигнала Sigterm

раскрыть ветку (8)
1
Автор поста оценил этот комментарий
Не обязательно дело в сохранении данных приложения, некоторые приложения могут сохранять за собой, к примеру, данные запуска приложения, PID файлы и т.д. и если данные файлы удаляются при обычном завершении то всё нормально, а если нет, то для повторного запуска уже приходится всё это вычищать. А параметр это -15 или просто kill без параметра по умолчанию
раскрыть ветку (7)
0
Автор поста оценил этот комментарий

просто килл сработает при ручном вводе. а в скрипте обязательно как в моём примере делать. но в моём примере для более общего случая не хватает нескольких проверок.

раскрыть ветку (6)
1
Автор поста оценил этот комментарий
Нет существенной разницы, запустил ты kill в терминале или запустил .sh в котором прописан kill. Единственно, может не хватать переменных окружения в некоторых случаях. Какая проблема у тебя возникает с kill в скрипте?
раскрыть ветку (5)
0
Автор поста оценил этот комментарий

если без ид он тупо не работает.
попробуйте зацементированную строчку вводить в терминал,
затем использовать её в скипте баш.

затем ту что не комментирована также.
сможете лично убедиться.

раскрыть ветку (4)
1
Автор поста оценил этот комментарий
Добрался до терминала. Проверил закомментированный вариант, у меня он отрабатывает корректно. Правда у меня нет plank, блокнота, калькулятора и т.д. Как пример, брал у себя мониторинг htop и всё работает корректно. Параллельно написал свой вариант sh для убийства процесса (мягкого и не очень), отдельный комментарием ниже выложу
раскрыть ветку (3)
0
Автор поста оценил этот комментарий
#!/bin/bash
# имя процесса для kill (можно указать $1 если нужно отправлять имя процесса аргументом)
# например ./script.sh htop для убийства htop ./script.sh plank для убийства plank
PROCESS_NAME="htop"
#PROCESS_NAME=$1

# Получаем PID(ы) процесса
PIDS=$(pidof "$PROCESS_NAME")

# Проверка, что процесс(ы) существует(ют)
if [ -z "$PIDS" ]; then
echo "Процесс '$PROCESS_NAME' не найден."
exit 1
fi

# Цикл по убийству процесса
for PID in $PIDS
do
echo "Мягкое завершение процесса $PROCESS_NAME с PID $PID"
# При убийстве отлавливаем ошибку недостатка прав пользователя
PERM_ERROR=$(kill "$PID" 2>&1)
sleep 2 # ждём завершение процесса (основываясь на времени, которое требуется процессу для корректного выключения, можно подкорректировать)
if kill -0 "$PID" 2>/dev/null
then
echo "Процесс $PID не завершился. Принудительное завершение (SIGKILL)..."
kill -9 "$PID"
sleep 2 # ждём завершение процесса

if kill -0 "$PID" 2>/dev/null
then
echo "Процесс $PID всё ещё жив. Не удалось завершить."
else
echo "Процесс $PID принудительно завершён."
fi
else
# Проверяем, была ли проблема с доступом
if echo "$PERM_ERROR" | grep -q "Operation not permitted"
then
echo "Недостаточно прав для завершения процесса $PID (запустите через sudo)"
exit 1
fi
echo "Процесс $PID успешно завершён мягко."
fi
done
раскрыть ветку (2)
0
Автор поста оценил этот комментарий

благодарю. интересный вариант, универсальный.

раскрыть ветку (1)
1
Автор поста оценил этот комментарий
Не за что. Только, когда писал, не заметил один недочет. Если возникнет ситуация с нехваткой прав на процессе (если их несколько), то цикл завершится и остальные процессы не будут убиты ( если у части процессов нет проблем с доступом). Всё из за exit 1. Тут нужно заменить:
exit 1
fi
echo "Процесс $PID успешно завершён мягко."
fi
done

На:

else
echo "Процесс $PID успешно завершён мягко."
fi
fi
done
Вы смотрите срез комментариев. Чтобы написать комментарий, перейдите к общему списку

Темы

Политика

Теги

Популярные авторы

Сообщества

18+

Теги

Популярные авторы

Сообщества

Игры

Теги

Популярные авторы

Сообщества

Юмор

Теги

Популярные авторы

Сообщества

Отношения

Теги

Популярные авторы

Сообщества

Здоровье

Теги

Популярные авторы

Сообщества

Путешествия

Теги

Популярные авторы

Сообщества

Спорт

Теги

Популярные авторы

Сообщества

Хобби

Теги

Популярные авторы

Сообщества

Сервис

Теги

Популярные авторы

Сообщества

Природа

Теги

Популярные авторы

Сообщества

Бизнес

Теги

Популярные авторы

Сообщества

Транспорт

Теги

Популярные авторы

Сообщества

Общение

Теги

Популярные авторы

Сообщества

Юриспруденция

Теги

Популярные авторы

Сообщества

Наука

Теги

Популярные авторы

Сообщества

IT

Теги

Популярные авторы

Сообщества

Животные

Теги

Популярные авторы

Сообщества

Кино и сериалы

Теги

Популярные авторы

Сообщества

Экономика

Теги

Популярные авторы

Сообщества

Кулинария

Теги

Популярные авторы

Сообщества

История

Теги

Популярные авторы

Сообщества