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?

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

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')()
    )

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


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.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.