Frage Linux: Wie kann man wissen, wo ein Prozess gestartet wurde und wie er gestartet wurde?


Ich habe eine Linux-Box überprüft und festgestellt, dass ein Perl-Prozess läuft und einen guten Teil der CPU-Nutzung verbraucht. Mit top konnte ich nur in process name perl.

Als ich drückte cUm die Befehlszeile anzuzeigen, wurde / var / spool / mail angezeigt. Was keinen Sinn ergibt, da dies Verzeichnis ist.

Meine Fragen sind:

1) Warum ist das passiert? Wie kann dieser Perl-Prozess seine Befehlszeile maskieren? 2) Was ist der zuverlässigste Weg herauszufinden, wo und wie ein Prozess gestartet wurde?

Vielen Dank!


27
2018-02-08 16:18


Ursprung




Antworten:


In den meisten Fällen läuft es einfach ps ist in der Regel ausreichend, zusammen mit Ihren Lieblingsflaggen, um eine breite Ausgabe zu ermöglichen. Ich lehne mich an ps -feww, aber die anderen Vorschläge werden hier funktionieren. Beachten Sie, dass wenn ein Programm von jemandem gestartet wurde $PATHSie sehen nur den Namen der ausführbaren Datei, nicht den vollständigen Pfad. Zum Beispiel, versuche dies:

$ lftp &
$ ps -feww | grep ftp
lars      9600  9504  0 11:30 pts/10   00:00:00 lftp
lars      9620  9504  0 11:31 pts/10   00:00:00 grep ftp

Es ist wichtig zu beachten, dass die Informationen in sichtbar sind ps kann vom laufenden Programm komplett überschrieben werden. Zum Beispiel, dieser Code:

int main (int argc, char **argv) {
        memset(argv[0], ' ', strlen(argv[0]));
        strcpy(argv[0], "foobar");
        sleep(30);
        return(0);
}

Wenn ich das in eine Datei namens "Myprogramm" kompiliere und es ausführe:

$ gcc -o myprogram myprogram.c
$ ./myprogram &
[1] 10201

Und dann renn psIch sehe einen anderen Prozessnamen:

$ ps -f -p 10201
UID        PID  PPID  C STIME TTY          TIME CMD
lars     10201  9734  0 11:37 pts/10   00:00:00 foobar

Sie können auch direkt sehen /proc/<pid>/exeDies kann ein Symlink zur entsprechenden ausführbaren Datei sein. Im obigen Beispiel gibt dies Ihnen viel mehr nützliche Informationen als ps:

$ls -l /proc/9600/exe
lrwxrwxrwx. 1 lars lars 0 Feb  8 11:31 /proc/9600/exe -> /usr/bin/lftp

31
2018-02-08 16:32



alles in allem die Dateien in /proc wird alle Informationen über ein Programm bereitstellen, exe wird ein Link zu ausführbaren Dateien sein, cwd zum aktuellen Arbeitsverzeichnis, fd Verzeichnis enthält Links zu offenen Dateien (einschließlich Standardeingabe, Ausgabe und Standardfehler) - Hubert Kario


Der zuverlässigste Weg ist es, auf die /proc dir für den Prozess. Jeder Prozess hat a /proc/<pid>/ Verzeichnis, in dem Informationen gespeichert werden wie:

  1. cwd Verknüpfung zum aktuellen Arbeitsverzeichnis
  2. fd ein Verzeichnis mit Links zu den geöffneten Dateien (Dateideskriptoren)
  3. cmdline Lesen Sie es, um zu sehen, welche Befehlszeile zum Starten des Prozesses verwendet wurde
  4. environ die Umgebungsvariablen für diesen Prozess
  5. root ein Link zu dem, was der Prozess als root dir betrachtet (es wird / außer chroot)

Es gibt mehr coole Informationen zu jedem Prozess / Proc, aber mit den oben genannten können Sie genau wissen, was vor sich geht.

Auch mit ps auxf wird dir zeigen, wer was gegabelt hat, damit du eine bessere Idee bekommst, wer dein Perl anruft.


41
2018-02-09 12:51



Ich verwende Process Explorer immer unter Windows und frage mich, ob es unter Linux ein Äquivalent gibt. Dieser Schalter macht alles! PS Auxf ... schön! - Yanick Girouard
+1 für den f-Parameter für ps, das hat es für mich getan! - Lennart Rolland
+1, um mir etwas beizubringen, was einem so grundlegenden Konzept ähnelt ... /proc enthält Prozessinformationen! Wer wusste?? Alles, wofür ich jemals nachgesehen habe, war version und cpuinfo und sowas ... und das löst mein eigentliches Problem, weil die Version von ps meines Routers alle Parameter ignoriert - Nacht
@coredump: und wenn der Prozess aufgerufen wirdchroot()vorher, wie kann ich wissen welches Verzeichnis/proc/ᴘɪᴅ/cwdentspricht ? - user2284570


für mich, gerade jetzt, fand ich das pstree gab einen viel klareren Hinweis darauf, wie ein Prozess gestartet wurde, als ps aux

es sieht aus wie das:

  ├─lightdm─┬─Xorg
  │         ├─lightdm─┬─init─┬─apache2───2*[apache2───26*[{apache2}]]
  │         │         │      ├─at-spi-bus-laun─┬─dbus-daemon
  │         │         │      │                 └─3*[{at-spi-bus-laun}]
  │         │         │      ├─at-spi2-registr───{at-spi2-registr}
  │         │         │      ├─dbus-daemon
  │         │         │      ├─dropbox───29*[{dropbox} ]

6
2017-08-21 12:07





Versuchen ps axww | grep perl um die vollständige Befehlszeile Ihres Prozesses zu erhalten. Es sieht aus wie top gerade eine lange Linie getrimmt.


1
2018-02-08 16:25





Verwenden Sie den Befehl fuser -vu /var/spool/mail Dieser Befehl zeigt Ihnen die PIDs der Prozesse an, die die angegebenen Dateien oder Dateisysteme verwenden. Im Standardanzeigemodus folgt auf jeden Dateinamen ein Buchstabe, der den Zugriffstyp angibt:

c - aktuelles Verzeichnis. e - ausführbare Datei wird ausgeführt. f - Datei öffnen. f wird im Standardanzeigemodus weggelassen. r - Wurzelverzeichnis. m - MMAP-Datei oder gemeinsam genutzte Bibliothek.

Vielleicht wird es Ihnen helfen, Ihre Suche weiter zu entwickeln, um zu antworten, wonach Sie suchen. Ich weiß nicht, ob es Ihnen hilft, aber vielleicht finden Sie einige nützliche Informationen.


1
2018-02-08 19:15





Ohne die Manpage für die genauen Flags zu Rate zu ziehen, ist eine einfache Möglichkeit, um herauszufinden, was die Befehlszeile und die Startzeit ist, ps auxwww sollte arbeiten. Sie können es eleganter machen, wenn Sie möchten, indem Sie die man-Seite lesen.


0
2018-02-08 16:26





Zwei Befehle fallen mir ein:

1) Holen Sie sich die Startzeit für den Prozess aus 'ps".

$ ps -ax -o pid,start,comm
  PID  STARTED COMMAND         USER
    1   Feb 06 init            root
    2   Feb 06 kthreadd        root
[...]
  13147 19:09:48 chrome          hcooper
  13270 19:13:51 chrome          hcooper
  13386 19:18:34 bash            hcooper

2) letzter Befehl, die ich jetzt überprüfe, habe ich nicht installiert. Jedenfalls sagt die Manpage-Beschreibung:

   lastcomm prints out information about previously executed commands. If
   no arguments are specified, lastcomm will print info about all of the
   commands in acct (the record file).

Aber wie einige Leute gesagt haben, wird "ls -al / proc /" dir viel erzählen!


0
2018-02-08 19:38