Я обычно убиваю процесс с killall
.
killall markdoc
Но я не уверен, что эта команда завершает процесс изящно. Достигает ли эта команда изящного завершения? Если это не так, как я могу изящно завершить процесс с его именем?
Я обычно убиваю процесс с killall
.
killall markdoc
Но я не уверен, что эта команда завершает процесс изящно. Достигает ли эта команда изящного завершения? Если это не так, как я могу изящно завершить процесс с его именем?
Ответы:
Ваш вопрос не ясен, вы говорите о демоне в заголовке, но в теле говорите только о общем процессе.
Для демона есть определенные средства, чтобы остановить его, например, в Debian у вас есть
service daemon-name stop
или
/etc/init.d/daemon-name stop
Подобные синтаксисы существуют для других стандартов initscript, используемых в других дистрибутивах / ОС.
Чтобы убить процесс, не являющийся демоном, предположив, что он каким-то образом вышел из-под контроля, вы можете безопасно использовать 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
утилиты, чтобы проверить, работают ли они преднамеренно, а затем используйте их. Пример: pkill -SIGTERM mysqld
отправит сигнал уничтожения TERM, чтобы mysqld выполнил безопасное завершение работы и сбросил базы данных на диск перед тем, как его убили.