Я зазвичай вбиваю процес із killall
.
killall markdoc
Але я не впевнений, якщо ця команда граціозно припинить процес. Чи досягає ця команда витонченого припинення? Якщо цього немає, як я можу витончено вбити процес із його ім'ям?
Я зазвичай вбиваю процес із killall
.
killall markdoc
Але я не впевнений, якщо ця команда граціозно припинить процес. Чи досягає ця команда витонченого припинення? Якщо цього немає, як я можу витончено вбити процес із його ім'ям?
Відповіді:
Ваше запитання не ясно, ви говорите про демона в заголовку, але в тілі говорите лише про родовий процес.
Для демона є специфічні засоби, щоб зупинити це, наприклад, у Debian, який у вас є
service daemon-name stop
або
/etc/init.d/daemon-name stop
Подібні синтаксиси існують для інших стандартів incriptcript, що використовуються в інших дистрибутивах / ОС.
Щоб вбити недемонний процес, припустивши, що він якимось чином виходить з-під контролю, ви можете сміливо використовувати killall
або pkill
, враховуючи, що вони за замовчуванням використовують SIGTERM
сигнал (15), і будь-яка гідно написана програма повинна вловлювати і витончено вийти з прийому цього сигналу . Враховуйте, що ці утиліти можуть знищити більше одного процесу, якщо їх багато з однаковою назвою.
Якщо це не виходить, ви можете спробувати SIGINT
(2), потім SIGHUP
(1) і в крайньому випадку SIGKILL
(9). Цей останній сигнал не може підхопити програму, тому він не може виконувати очищення. З цієї причини цього слід уникати кожного разу, коли зможете.
Обидва pkill
і killall
приймають параметр сигналу у формі -NAME
, як у
pkill -INT process-name
markdoc serve &
і svnserve -d
. Я думаю, що це якийсь демон, але нічого для мене не було певне :)
killall
вбивця!
У BSD-подібних та інших дистрибутивах, у /etc/rc.d/ ви часто будете мати сценарії, які зазвичай керують запуском, перезапуском та зупинкою демонів у вашій системі. Щоб зупинити демон, ви б або викликали сценарії абсолютним шляхом, наприклад:
# /etc/rc.d/acpid stop
або скористайтеся командою:
# rc.d stop acpid
Я настійно рекомендую спробувати цей сценарій для показу ваших систем, запущених та зупинених демонів:
#!/bin/bash
chk_status(){
target=$1
if [[ $target != "functions" && $target != "functions.d" ]]
then
if [[ -f "/var/run/daemons/$target" ]]
then
stat="\e[1;32m[RUNNING]"
else
stat="\e[1;31m[STOPPED]"
fi
printf "$stat \t\e[1;34m$target\e[0;0m\n"
fi
}
daemons=($(for daemon in /etc/rc.d/*; do echo "${daemon#\/etc\/rc.d\/}"; done))
if [[ $1 != "" ]]
then
chk_status $1
else
for d in "${daemons[@]}"; do
chk_status $d
done | sort
fi
Перевірте наявність killproc
функцій у /etc/init.d/functions
скрипті, вкажіть файл та скористайтеся функцією. Або використовувати pgrep
і pkill
утиліти для перевірки , чи є вони працюють intendedly , а потім використовувати їх. Приклад: pkill -SIGTERM mysqld
надішле сигнал TERM kill, щоб mysqld здійснив безпечне відключення та передав бази даних на диск, перш ніж вбити.