Как изящно убить демона с его именем?

16

Я обычно убиваю процесс с killall.

killall markdoc

Но я не уверен, что эта команда завершает процесс изящно. Достигает ли эта команда изящного завершения? Если это не так, как я могу изящно завершить процесс с его именем?

Eonil
источник
В вашем дистрибутиве есть start-stop-daemon ?
Манатворк
Я использую Ubuntu 10.04 LTS сервер x64 . Что это за демон?
Эонил
Это универсальный инструмент для запуска / остановки демонов и управления связанной информацией, такой как pid-файлы. Он присутствует в Ubuntu, смотрите его справочную страницу .
manatwork

Ответы:

19

Ваш вопрос не ясен, вы говорите о демоне в заголовке, но в теле говорите только о общем процессе.

Для демона есть определенные средства, чтобы остановить его, например, в 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
enzotib
источник
Спасибо. На самом деле мой оригинальный вопрос был о markdoc serve &и svnserve -d. Я думаю, что это своего рода демон, но я ничего не
знал
killallэто убийца!
xdevs23
3

В 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

источник
0

Проверьте наличие killprocфункции в /etc/init.d/functionsскрипте, найдите файл и используйте функцию. Или используйте pgrepи pkillутилиты, чтобы проверить, работают ли они преднамеренно, а затем используйте их. Пример: pkill -SIGTERM mysqldотправит сигнал уничтожения TERM, чтобы mysqld выполнил безопасное завершение работы и сбросил базы данных на диск перед тем, как его убили.

Никхил Мулли
источник