Як граціозно вбити демона з його ім'ям?


16

Я зазвичай вбиваю процес із killall.

killall markdoc

Але я не впевнений, якщо ця команда граціозно припинить процес. Чи досягає ця команда витонченого припинення? Якщо цього немає, як я можу витончено вбити процес із його ім'ям?


Чи має ваш дистрибутив старт-стоп-демон ?
манантська робота

Я використовую сервер Ubuntu 10.04 LTS x64 . Що це за демон?
Еоніл

Це універсальний інструмент для запуску / зупинки демонів та управління пов’язаною інформацією, як-от pid-файли. Він присутній в Ubuntu, дивіться його довідкову сторінку .
манатство

Відповіді:


19

Ваше запитання не ясно, ви говорите про демона в заголовку, але в тілі говорите лише про родовий процес.

Для демона є специфічні засоби, щоб зупинити це, наприклад, у 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. Я думаю, що це якийсь демон, але нічого для мене не було певне :)
Eonil

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утиліти для перевірки , чи є вони працюють intendedly , а потім використовувати їх. Приклад: pkill -SIGTERM mysqldнадішле сигнал TERM kill, щоб mysqld здійснив безпечне відключення та передав бази даних на диск, перш ніж вбити.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.