Ich habe ein Init-Skript /etc/init.d/myservice
zum Initialisieren eines Dienstes wie folgt:
...
start() {
...
daemon /usr/sbin/myservice
...
}
stop() {
...
pgrep myservice
pidof myservice
ps -ef | grep myservice
...
}
Und wenn ich versuche, den Dienst zu beenden, ist dies die Ausgabe:
10000 10001
10000
root 10000 1 0 09:52 ? 00:00:02 /usr/sbin/myservice
root 9791 9788 0 10:06 pts/1 00:00:00 /bin/sh /sbin/service myservice stop
root 10001 9791 1 10:06 pts/1 00:00:00 /bin/sh /etc/init.d/myservice stop
root 9805 9796 0 10:06 pts/1 00:00:00 grep myservice
Wird das erwartet? Warum pidof
wird nur die richtige PID des Dienstes zurückgegeben, den ich stoppen möchte, und pgrep
die Dienst-PID und die PID des Init-Skripts zurückgegeben? Kann ich mich darauf verlassen, pidof
dass die PID aus dem Init-Skript immer ignoriert wird?
quelle
pidof
kehrt man nicht zurück10001
, weil das Programm istsh
, nein?Ich denke, Sie sollten sich nicht darauf verlassen
pidof
, es kann dazu führen, dass Ihr Programm fehlschlägt. Ein einfaches Beispiel mitsupervisord
Programm:Sie können sehen, dass das
supervisord
tatsächlich vom Python-Interpreter aufgerufen wird, waspidof
zum Scheitern führt:quelle
killproc
. Warum verwenden Sie dies nicht, während Siedaemon
in derstart
Funktion verwendet haben?killproc
tötet , habe ich den Prozess selbst beendet.parent process
, ist auch seinchild process
Wille gestorben.Der
pidof
Befehl ignoriert Skripte, sofern Sie die-x
Option nicht einschließen . Außerdem ist es am sichersten, den vollständigen Pfad in den Befehl pidof aufzunehmen, wie in:Dies minimiert die Wahrscheinlichkeit, dass ein anderer Prozess übereinstimmt.
quelle