GNU/Linux >> LINUX-Kenntnisse >  >> Linux

Wie funktioniert der ps-Befehl?

Unter Linux der ps Der Befehl funktioniert, indem er Dateien im proc-Dateisystem liest. Das Verzeichnis /proc/PID enthält verschiedene Dateien, die Informationen über den Prozess PID liefern . Der Inhalt dieser Dateien wird im laufenden Betrieb vom Kernel generiert, wenn ein Prozess sie liest.

Eine Dokumentation zu den Einträgen finden Sie in /proc in der Manpage proc(5) und in der Kernel-Dokumentation.

Sie können dies selbst herausfinden, indem Sie die ps beobachten Befehl tut mit strace , ein Befehl, der die Systemaufrufe eines Prozesses auflistet.

% strace -e open ps
open("/etc/ld.so.cache", O_RDONLY|O_CLOEXEC) = 3
open("/lib/x86_64-linux-gnu/libprocps.so.3", O_RDONLY|O_CLOEXEC) = 3
open("/lib/x86_64-linux-gnu/libdl.so.2", O_RDONLY|O_CLOEXEC) = 3
open("/lib/x86_64-linux-gnu/libc.so.6", O_RDONLY|O_CLOEXEC) = 3
open("/sys/devices/system/cpu/online", O_RDONLY|O_CLOEXEC) = 3
open("/usr/lib/locale/locale-archive", O_RDONLY|O_CLOEXEC) = 3
open("/proc/self/stat", O_RDONLY)       = 3
open("/proc/uptime", O_RDONLY)          = 3
open("/proc/sys/kernel/pid_max", O_RDONLY) = 4
open("/proc/meminfo", O_RDONLY)         = 4
open("/proc/1/stat", O_RDONLY)          = 6
open("/proc/1/status", O_RDONLY)        = 6
open("/proc/2/stat", O_RDONLY)          = 6
open("/proc/2/status", O_RDONLY)        = 6
open("/proc/3/stat", O_RDONLY)          = 6
open("/proc/3/status", O_RDONLY)        = 6
…

% strace -e open ps
…
open("/proc/1/stat", O_RDONLY)          = 6
open("/proc/1/status", O_RDONLY)        = 6
open("/proc/1/cmdline", O_RDONLY)       = 6
…

Vielleicht möchten Sie einen Blick in /proc werfen Mappe:
Jeder Prozess, der auf Ihrem Rechner läuft, hat hier einen Unterordner mit vielen Dateien (der nützlichste IMO ist comm , die den Namen des Prozesses angibt.)


Es funktioniert mit der Bibliothek libprocps.so.

Das Hauptformat ist :

(A) start (Aufruf von openproc())

(B) Informationen des Prozesses lesen (readproc() für jeden aufrufen)

(C) stop (Aufruf von closeproc())

Die Verwendung von libprocps.so bietet Vorteile (z. B. die Befreiung vom Programmieren einer Reihe von "Parsing"-Funktionen) und Nachteile (vielleicht möchten Sie weniger Informationen als durch Aufrufe von readproc() gesammelt werden).

Ein Programm, das libprocps.so verwendet, hat dieses grundlegende Format.

    #include <proc/readproc.h>
         :
    int main()
   {
         :
       PROCTAB *proctab = openproc(<OPTIONS>) ;
         :
         :
       proc_t procinfo ;
       memset(&procinfo, 0, sizeof(procinfo)) ;
       while(readproc(proctab, &procinfo) != nullptr)
       {
          <do something with procinfo data>
       }
         :
         :
       closeproc(proctab) ;
       return 0 ;
    }

procinfo enthält alle Informationen für einen Prozess (wie utime, stime, Priorität, nice, ppid usw.) bereits im numerischen Format. Wenn Sie die Quellen heruntergeladen haben, proc_t struct ist in readproc.h

definiert

Die OPTIONEN Sie können im openproc()-Aufruf bitweise ODER-Flags verwenden, also können Sie eines oder mehrere von then als :

verwenden
    PROCTAB *proctab = openproc(PROC_FILLMEM | PROC_FILLCOM) ;

Sie sind auch in readproc.h definiert (suchen Sie nach '#define PROC_FILLMEM').


Linux
  1. So verwenden Sie den Linux-Grep-Befehl

  2. Der Zweck von .bashrc und wie funktioniert es?

  3. Wie funktioniert der Continue-Befehl in einem Bash-Skript mit eingebetteten Schleifen?

  4. Wie funktioniert der Exit-Befehl auf einem Unix-Terminal?

  5. Wie berechnet der Befehl stat die Blöcke einer Datei?

So verwenden Sie den Linux-Verlaufsbefehl

So verwenden Sie den Bash-Lesebefehl

So verwenden Sie den Linux-xargs-Befehl

Was ist Source Command in Linux und wie funktioniert es?

Wie funktioniert das <( cmd )-Muster in Bash?

Wie funktioniert eine Linux-GUI auf der untersten Ebene?