Warum verhalten sich pidof und pgrep unterschiedlich?

8

Ich habe ein Init-Skript /etc/init.d/myservicezum 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 pidofwird nur die richtige PID des Dienstes zurückgegeben, den ich stoppen möchte, und pgrepdie Dienst-PID und die PID des Init-Skripts zurückgegeben? Kann ich mich darauf verlassen, pidofdass die PID aus dem Init-Skript immer ignoriert wird?

Pigueiras
quelle

Antworten:

7

pidof = Finde die Prozess-ID eines laufenden Programms

Pidof findet die Prozess-IDs (Pids) der genannten Programme. Diese IDs werden auf der Standardausgabe gedruckt. Dieses Programm ist auf einigen Systemen verfügbar, die in Änderungsskripten auf Run-Ebene verwendet werden, insbesondere wenn das System eine System-V-ähnliche RC-Struktur hat.

sysadmin@codewarden:~$ pidof apache2
5098 5095 5094 5092

pgrep = Nachschlagen oder Signalisieren von Prozessen basierend auf Namen und anderen Attributen. pgrep durchsucht die aktuell ausgeführten Prozesse und listet die Prozess-IDs auf, die den Auswahlkriterien entsprechen.

sysadmin@codewarden:~$ pgrep apache2
5092
5094
5095
5098

pgrep, (p) = process, grep= grep druckt die übereinstimmenden Zeilen

Möchten Sie mehr über pgrep & pidof erfahren? Einfach im Terminal als ausführen

# man pidof
# man pgrep
Babin Lonston
quelle
1
Aha, deshalb pidofkehrt man nicht zurück 10001, weil das Programm ist sh, nein?
Pigueiras
Ja, Sie haben Recht
Babin Lonston
0

Ich denke, Sie sollten sich nicht darauf verlassen pidof, es kann dazu führen, dass Ihr Programm fehlschlägt. Ein einfaches Beispiel mit supervisordProgramm:

% cuonglm at ~
% ps -ef | grep supervisord
root      8512     1  0 16:53 ?        00:00:00 /usr/bin/python /usr/bin/supervisord
cuonglm   8584  7688  0 17:00 pts/0    00:00:00 grep --color=auto supervisord
% cuonglm at ~
% pidof supervisord
% cuonglm at ~
% 

Sie können sehen, dass das supervisordtatsächlich vom Python-Interpreter aufgerufen wird, was pidofzum Scheitern führt:

#! /usr/bin/python                                                            
# EASY-INSTALL-ENTRY-SCRIPT: 'supervisor==3.0a8','console_scripts','supervisord'
__requires__ = 'supervisor==3.0a8'                                            
import sys                                                                    
from pkg_resources import load_entry_point                                    

if __name__ == '__main__':                                                    
    sys.exit(                                                                 
        load_entry_point('supervisor==3.0a8', 'console_scripts', 'supervisord')()
    )
cuonglm
quelle
Aber in diesem Fall kann ich mich darauf verlassen, nein? Ich verwende keinen Interpreter, um das Programm auszuführen (es ist eine ausführbare Binärdatei).
Pigueiras
Na sicher. Aber ich denke, der gute Weg ist die Verwendung killproc. Warum verwenden Sie dies nicht, während Sie daemonin der startFunktion verwendet haben?
Cuonglm
Da ich möchte, dass die PID die Kinder des Prozesses killproctötet , habe ich den Prozess selbst beendet.
Pigueiras
Warum musst du das tun? Wenn du tötest parent process, ist auch sein child processWille gestorben.
Cuonglm
Nein, ich glaube nicht: stackoverflow.com/questions/8533377/…
Pigueiras
0

Der pidofBefehl ignoriert Skripte, sofern Sie die -xOption nicht einschließen . Außerdem ist es am sichersten, den vollständigen Pfad in den Befehl pidof aufzunehmen, wie in:

killme=$(pidof -x /usr/bin/supervisord)
      *instead of*
killme=$(pidof -x supervisord)

Dies minimiert die Wahrscheinlichkeit, dass ein anderer Prozess übereinstimmt.

John Hascall
quelle