Wie kann man einen Daemon mit seinem Namen anmutig töten?

16

Normalerweise töte ich einen Prozess mit killall.

killall markdoc

Ich bin mir jedoch nicht sicher, ob dieser Befehl den Vorgang ordnungsgemäß beendet. Erreicht dieser Befehl eine ordnungsgemäße Beendigung? Wenn dies nicht der Fall ist, wie kann ich einen Prozess mit seinem Namen ordnungsgemäß beenden?

Eonil
quelle
Hat Ihre Distribution einen Start-Stop-Daemon ?
Manatwork
Ich benutze Ubuntu 10.04 LTS Server x64 . Was ist das für ein Dämon?
Eonil
Es ist ein allgemeines Tool zum Starten / Stoppen von Daemons und zum Verwalten verwandter Informationen wie PID-Dateien. Es ist in Ubuntu vorhanden, siehe Manpage .
Manatwork

Antworten:

19

Ihre Frage ist nicht klar, Sie sprechen im Titel von einem Daemon, aber im Text nur von einem generischen Prozess.

Für einen Daemon gibt es spezielle Methoden, um ihn zu stoppen, zum Beispiel in Debian

    service daemon-name stop

oder

    /etc/init.d/daemon-name stop

Ähnliche Syntaxen gibt es für andere Initscript-Standards, die in anderen Distributionen / Betriebssystemen verwendet werden.

Um einen Nicht-Daemon-Prozess abzubrechen, können Sie sicher killalloder , vorausgesetzt pkill, sie verwenden standardmäßig das SIGTERM(15) -Signal, und jede anständige geschriebene Anwendung sollte dieses Signal abfangen und ordnungsgemäß beenden, wenn Sie es empfangen . Berücksichtigen Sie, dass diese Dienstprogramme mehr als einen Prozess beenden können, wenn es mehrere mit demselben Namen gibt.

Wenn das nicht funktioniert, können Sie versuchen SIGINT(2), dann SIGHUP(1) und als letztes Mittel SIGKILL(9). Dieses letzte Signal kann von der Anwendung nicht abgefangen werden, sodass keine Bereinigung durchgeführt werden kann. Aus diesem Grund sollte es jedes Mal vermieden werden, wenn Sie können.

Beide pkillund killallakzeptieren einen Signalparameter in der Form -NAMEwie in

pkill -INT process-name
Enzotib
quelle
Vielen Dank. Eigentlich ging meine ursprüngliche Frage um markdoc serve &und svnserve -d. Ich denke, es ist eine Art Daemon, aber mir war nichts sicher :)
Eonil
killallist der Mörder!
xdevs23
3

Auf BSD-ähnlichen und anderen Distributionen haben Sie häufig Skripte in /etc/rc.d/, die normalerweise das Starten, Neustarten und Stoppen von Daemons in Ihrem System verwalten. Um einen Daemon zu stoppen, würden Sie entweder die Skripte mit dem absoluten Pfad aufrufen, zB:

# /etc/rc.d/acpid stop

oder benutze den Befehl:

# rc.d stop acpid

Ich empfehle dringend, dieses Skript auszuprobieren, um zu zeigen, dass Ihre Systeme Daemons gestartet und gestoppt haben:

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

quelle
0

Suchen Sie nach killprocim /etc/init.d/functionsSkript verfügbaren Funktionen , geben Sie die Quelle für die Datei ein und verwenden Sie die Funktion. Oder verwenden Sie pgrepund pkillDienstprogramme, um zu überprüfen, ob sie bestimmungsgemäß funktionieren, und verwenden Sie sie dann. Beispiel: pkill -SIGTERM mysqldwürde das TERM-Kill-Signal senden, damit mysqld ein sicheres Herunterfahren durchführt und die Datenbanken auf die Festplatte spült, bevor sie getötet werden.

Nikhil Mulley
quelle