it-swarm.com.de

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

Ich habe ein Linux-Kontrollkästchen aktiviert und festgestellt, dass ein Perl-Prozess ausgeführt wird und einen guten Teil der CPU-Auslastung übernimmt. Mit top konnte ich nur Perl im Prozessnamen.

Als ich c drückte, um die Befehlszeile anzuzeigen, wurde/var/spool/mail angezeigt. Was keinen Sinn macht, da dies ein Verzeichnis ist.

Meine Fragen sind:

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

Vielen Dank!

38
Fernando

In den meisten Fällen reicht es normalerweise aus, nur ps zusammen mit Ihren Lieblingsflags auszuführen, um eine breite Ausgabe zu ermöglichen. Ich neige zu ps -feww, Aber die anderen Vorschläge hier werden funktionieren. Beachten Sie, dass beim Starten eines Programms aus $PATH Nur 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 ps sichtbaren Informationen vom 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 ausführe:

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

Und dann ps ausführen, wird ein anderer Prozessname angezeigt:

$ 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 auf /proc/<pid>/exe Schauen, das möglicherweise ein Symlink zur entsprechenden ausführbaren Datei ist. Im obigen Beispiel erhalten Sie dadurch viel nützlichere Informationen als ps:

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

Am zuverlässigsten ist es, die /proc dir für den Prozess. Jeder Prozess hat ein /proc/<pid>/ Verzeichnis, in dem Informationen gespeichert sind wie:

  1. cwd Link 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-Verzeichnis betrachtet (es wird/sofern nicht chrootiert)

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

Verwenden Sie auch ps auxf zeigt Ihnen, wer was gegabelt hat, damit Sie eine bessere Vorstellung davon bekommen, wer Ihren Perl anruft.

59
coredump

für mich stellte ich gerade fest, dass pstree einen viel klareren Hinweis darauf gab, 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} ]
12

Versuchen ps axww | grep Perl, um die vollständige Befehlszeile Ihres Prozesses abzurufen. Es sieht so aus, als hätte top gerade eine lange Zeile gekürzt.

2
Alex

Versuchen Sie es mit dem Befehl fuser -vu /var/spool/mail Dieser Befehl zeigt Ihnen die PIDs von Prozessen an, 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. f wird im Standardanzeigemodus weggelassen. r - Stammverzeichnis. m - mmap'ed Datei oder gemeinsam genutzte Bibliothek.

Vielleicht hilft es Ihnen, Ihre Suche voranzutreiben, um die gesuchte Antwort zu erhalten. Ich weiß nicht, ob es Ihnen hilft, aber vielleicht finden Sie einige nützliche Informationen heraus.

2
panaroik

Ohne die Manpage nach den genauen Flags zu durchsuchen, sollte ps auxwww funktionieren, um herauszufinden, wie die Befehlszeile und die Startzeit aussehen. Sie können es auf Wunsch eleganter gestalten, indem Sie die Manpage lesen.

1
Jason Tan

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) lastcomm, was ich jetzt überprüfe, habe ich nicht installiert. Wie auch immer, die Manpage-Beschreibung sagt:

   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 /" Ihnen viel sagen!

1
Coops

sie können verwenden:

systemctl status <PID>

oder mit dem Namen des Prozesses:

systemctl status $(pgrep Perl)

Dadurch werden Informationen zu systemd-Diensten bereitgestellt, die Ihren Prozess gestartet haben.

Ich habe diesen Hinweis gefunden hier

0
TVK