Como matar um daemon com seu nome graciosamente?

13

Eu geralmente mato um processo com killall .

killall markdoc

Mas não tenho certeza se esse comando encerra o processo normalmente. Este comando consegue um término gracioso? Se não, como posso matar um processo com o nome graciosamente?

    
por Eonil 04.01.2012 / 07:00

3 respostas

15

Sua pergunta não está 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 de scripts escritos em outras distribuições / SO.

Para eliminar um processo que não seja daemon, supondo que ele esteja fora de controle, você pode usar com segurança killall ou pkill , já que eles usam por padrão o sinal SIGTERM (15) e qualquer aplicação decentemente escrita deve pegar e sair graciosamente ao receber este sinal. Leve em conta 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 qualquer limpeza. Por este motivo, deve ser evitado sempre que puder.

Tanto pkill quanto killall aceitam um parâmetro de sinal no formato -NAME , como em

pkill -INT process-name
    
por 04.01.2012 / 08:11
2

Em distros como o BSD e outras distros, você geralmente terá scripts em /etc/rc.d/ que normalmente gerenciam iniciar, reiniciar e parar daemons em seu sistema. Para parar um daemon, você poderia chamar os scripts com o caminho absoluto, por exemplo:

# /etc/rc.d/acpid stop

ou use o comando:

# rc.d stop acpid

É altamente recomendável testar esse script para mostrar seus daemons de sistemas iniciados e interrompidos:

#!/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
    
por 04.01.2012 / 09:01
0

Verifique a função killproc disponível no script /etc/init.d/functions , crie o arquivo e use a função. Ou use os utilitários pgrep e pkill para verificar se estão funcionando corretamente e, em seguida, use-os. Exemplo: pkill -SIGTERM mysqld enviaria o sinal de terminação TERM para que o mysqld executasse um desligamento seguro e limpasse os bancos de dados no disco, antes de ser morto.

    
por 04.01.2012 / 07:14

Tags