Comment tuer un démon avec son nom gracieusement?

16

Je tue habituellement un processus avec killall.

killall markdoc

Mais je ne sais pas si cette commande met fin au processus avec élégance. Cette commande atteint-elle une terminaison gracieuse? Si ce n'est pas le cas, comment puis-je tuer un processus avec son nom avec élégance?

Eonil
la source
Votre distribution a -t-elle un démon start-stop ?
manatwork
J'utilise le serveur Ubuntu 10.04 LTS x64 . Quel est ce démon?
Eonil
C'est un outil générique pour démarrer / arrêter les démons et gérer les informations connexes, comme les fichiers pid. Il est présent dans Ubuntu, voir sa page de manuel .
manatwork

Réponses:

19

Votre question n'est pas claire, vous parlez d'un démon dans le titre, mais dans le corps ne parlez que d'un processus générique.

Pour un démon, il existe des moyens spécifiques pour l'arrêter, par exemple dans Debian vous avez

    service daemon-name stop

ou

    /etc/init.d/daemon-name stop

Des syntaxes similaires existent pour d'autres normes initscript utilisées dans d'autres distributions / OS.

Pour tuer un processus non démon, en supposant qu'il est en quelque sorte hors de contrôle, vous pouvez utiliser en toute sécurité killallou pkill, étant donné qu'ils utilisent par défaut le SIGTERMsignal (15), et toute application décemment écrite devrait intercepter et quitter avec élégance à la réception de ce signal . Tenez compte du fait que ces utilitaires peuvent tuer plus d'un processus, s'il y en a plusieurs avec le même nom.

Si cela ne fonctionne pas, vous pouvez essayer SIGINT(2), puis SIGHUP(1) et en dernier recours SIGKILL(9). Ce dernier signal ne peut pas être capté par l'application, de sorte qu'elle ne peut effectuer aucun nettoyage. Pour cette raison, il doit être évité chaque fois que vous le pouvez.

Les deux pkilletkillall accepter un paramètre de signal sous la forme -NAME, comme dans

pkill -INT process-name
enzotib
la source
Je vous remercie. En fait, ma question initiale portait sur markdoc serve &et svnserve -d. Je pense que c'est une sorte de démon, mais rien n'était certain pour moi :)
Eonil
killallest le tueur!
xdevs23
3

Sur BSD et d'autres distributions, vous aurez souvent des scripts dans /etc/rc.d/ qui gèrent généralement le démarrage, le redémarrage et l'arrêt des démons dans votre système. Pour arrêter un démon, vous devez soit appeler les scripts avec le chemin absolu, par exemple:

# /etc/rc.d/acpid stop

ou utilisez la commande:

# rc.d stop acpid

Je recommande fortement d'essayer ce script pour montrer les démons démarrés et arrêtés de vos systèmes:

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

la source
0

Vérifiez la killprocfonction disponible dans le /etc/init.d/functionsscript, sourcez le fichier et utilisez la fonction. Ou utilisez pgrepet pkillutilitaires pour vérifier s'ils fonctionnent correctement, puis utilisez-les. Exemple: pkill -SIGTERM mysqldenverrait le signal de suppression TERM pour que mysqld effectue un arrêt sûr et vider les bases de données sur le disque, avant d'être tué.

Nikhil Mulley
la source