Como matar um daemon com seu nome graciosamente?

16

Eu costumo matar um processo com killall.

killall markdoc

Mas não tenho certeza se esse comando finaliza o processo normalmente. Este comando alcança um término normal? Caso contrário, como posso matar um processo com seu nome normalmente?

Eonil
fonte
Sua distribuição possui start-stop-daemon ?
manatwork
Estou usando o servidor Ubuntu 10.04 LTS x64 . O que é esse daemon?
Eonil
É uma ferramenta genérica para iniciar / parar daemons e gerenciar informações relacionadas, como arquivos pid. Está presente no Ubuntu, veja sua página de manual .
Manatwork

Respostas:

19

Sua pergunta não é clara: você fala sobre um daemon no título, mas no corpo apenas fala sobre um processo genérico.

Para um daemon, existem meios específicos para pará-lo, por exemplo, no Debian, você tem

    service daemon-name stop

ou

    /etc/init.d/daemon-name stop

Existem sintaxes semelhantes para outros padrões initscript usados ​​em outras distribuições / SO.

Para eliminar um processo que não seja daemon, supondo que ele esteja de alguma forma fora de controle, você pode usar com segurança killallou pkill, uma vez que eles usam por padrão o SIGTERMsinal (15), e qualquer aplicativo decentemente escrito deve capturar e sair normalmente ao receber esse sinal . Leve em consideração que esses utilitários podem matar mais de um processo, se houver muitos com o mesmo nome.

Se isso não funcionar, você pode tentar SIGINT(2), depois SIGHUP(1) e como último recurso SIGKILL(9). Este último sinal não pode ser capturado pelo aplicativo, para que ele não possa executar nenhuma limpeza. Por esse motivo, deve ser evitado sempre que possível.

Ambos pkille killallaceitam um parâmetro de sinal no formulário -NAME, como em

pkill -INT process-name
enzotib
fonte
Obrigado. Na verdade, minha pergunta original era sobre markdoc serve &e svnserve -d. Eu acho que é uma espécie de daemon, mas nada estava certo para mim :)
Eonil
killallé o assassino!
Xdevs23
3

Nas distribuições do tipo BSD e outras, você geralmente terá scripts em /etc/rc.d/ que normalmente gerenciam o início, a reinicialização e a parada de daemons em seu sistema. Para parar um daemon, você chamaria os scripts com o caminho absoluto, por exemplo:

# /etc/rc.d/acpid stop

ou use o comando:

# rc.d stop acpid

Eu recomendo experimentar este script para mostrar seus sistemas iniciados e interrompidos daemons:

#!/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

fonte
0

Verifique a killprocfunção disponível no /etc/init.d/functionsscript, origine o arquivo e use a função Ou use pgrepe pkillutilitários para verificar se eles estão funcionando intencionalmente e depois usá-los. Exemplo: pkill -SIGTERM mysqldenviaria o sinal de interrupção do TERM para que o mysqld executasse um desligamento seguro e liberasse os bancos de dados no disco antes de ser morto.

Nikhil Mulley
fonte