Linux: Woher wissen, wo ein Prozess gestartet wurde und wie er gestartet wurde?

33

Ich habe ein Linux-Kontrollkästchen überprüft und festgestellt, dass ein Perl-Prozess ausgeführt wird und einen guten Anteil der CPU-Auslastung hat. Mit Top konnte ich nur im Prozessnamen perlen.

Wenn ich c drückte , um die Befehlszeile anzuzeigen, zeigte es / var / spool / mail. Was keinen Sinn macht, da dies Verzeichnis ist.

Meine Fragen sind:

1) Warum ist das passiert? Wie kann dieser Perl-Prozess seine Befehlszeile maskieren? 2) Wie lässt sich am zuverlässigsten herausfinden, wo und wie ein Prozess gestartet wurde?

Vielen Dank!

Fernando
quelle

Antworten:

36

In den meisten Fällen reicht es aus, nur zu laufen und psIhre bevorzugten Flags zu verwenden, um eine breite Ausgabe zu ermöglichen. Ich neige dazu ps -feww, aber die anderen Vorschläge hier werden funktionieren. Beachten Sie, dass beim Starten eines Programms von einer anderen Person $PATHnur der Name der ausführbaren Datei und nicht der vollständige Pfad angezeigt wird. Versuchen Sie zum Beispiel Folgendes:

$ 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 in sichtbaren Informationen psvom laufenden Programm vollständig überschrieben werden können. 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 dies in eine Datei namens "myprogram" kompiliere und es ausführe:

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

Und dann starte ps, ich 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 nachsehen /proc/<pid>/exe, welches ein Symlink zur entsprechenden ausführbaren Datei sein kann. Im obigen Beispiel erhalten Sie 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
larsks
quelle
1
Alles in allem /procliefern die Dateien alle Informationen über ein Programm, exesind eine Verknüpfung zur ausführbaren Datei, cwdzum aktuellen Arbeitsverzeichnis, das fdVerzeichnis enthält Verknüpfungen zu geöffneten Dateien (einschließlich Standardeingabe, -ausgabe und Standardfehler)
Hubert Kario
57

Am zuverlässigsten ist es, das /procVerzeichnis für den Prozess zu überprüfen. Jeder Prozess verfügt über ein /proc/<pid>/Verzeichnis, in dem Informationen wie die folgenden gespeichert werden:

  1. cwd Link zum aktuellen Arbeitsverzeichnis
  2. fd ein Verzeichnis mit Links zu den geöffneten Dateien (Dateideskriptoren)
  3. cmdline Lesen Sie, 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-Verzeichnis ansieht (es wird / es sei denn, es ist chrooted)

Es gibt mehr coole Informationen zu jedem Prozess / Prozess, aber mit diesen oben können Sie genau wissen, was los ist.

Außerdem ps auxfzeigt Ihnen using , wer was gabelte, damit Sie eine bessere Vorstellung davon bekommen, wer Ihr Perl aufruft.

Core-Dump
quelle
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
+1 für den Parameter f für ps, das hat es für mich getan!
Lennart Rolland
2
+1, um mir beizubringen, was ein so grundlegendes Konzept zu sein scheint ... /procenthält Prozessinformationen! Wer wusste?? alles, wonach ich dort jemals gesucht habe, war versionund so weiter cpuinfo... und das löst mein eigentliches Problem, da die Version von ps meines Routers alle Parameter ignoriert
Nacht - Reinstate Monica
@coredump: und wenn der prozess chroot()vorher aufgerufen hat, woher kann ich wissen welchem ​​verzeichnis das /proc/ᴘɪᴅ/cwdentspricht?
user2284570
10

Ich fand gerade, dass dies pstreeeinen viel klareren Hinweis darauf gibt, wie ein Prozess gestartet wurde, alsps 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} ]
unendlich-etcetera
quelle
2

Versuchen Sie ps axww | grep perl, die vollständige Befehlszeile Ihres Prozesses abzurufen. Es sieht so aus, als hätte man topgerade eine lange Schlange gezogen.

Alex
quelle
2

Try use-Befehl Mit fuser -vu /var/spool/mail diesem Befehl werden die PIDs von Prozessen angezeigt, die die angegebenen Dateien oder Dateisysteme verwenden. Im Standardanzeigemodus folgt auf jeden Dateinamen ein Buchstabe, der die Art des Zugriffs angibt:

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

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

panaroik
quelle
1

Ohne die Manpage zu konsultieren, um die genauen Flags zu erfahren, eine einfache Möglichkeit, um herauszufinden, wie die Befehlszeile und die Startzeit lauten, sollte ps auxwww funktionieren. Sie können es auf Wunsch eleganter gestalten, indem Sie die Manpage lesen.

Jason Tan
quelle
1

Zwei Befehle fallen mir ein:

1) Ermitteln Sie 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) lastcomm , das ich jetzt überprüfe, habe ich nicht installiert. Wie auch immer, die Beschreibung der Manpage lautet:

   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 ein paar Leute gesagt haben, "ls -al / proc /" wird Ihnen viel erzählen!

Coops
quelle
0

Sie können verwenden:

systemctl status <PID>

oder mit dem Namen des Prozesses:

systemctl status $(pgrep perl)

Dies liefert Informationen zu den Systemdiensten, die Ihren Prozess gestartet haben.

Ich habe diesen Hinweis hier gefunden

TVK
quelle