Lösung 1:
Am zuverlässigsten ist es, sich den /proc
anzusehen dir für den Prozess. Jeder Prozess hat eine /proc/<pid>/
Verzeichnis, in dem Informationen aufbewahrt werden wie:
cwd
Link zum aktuellen Arbeitsverzeichnisfd
ein Verzeichnis mit Links zu den geöffneten Dateien (Dateideskriptoren)cmdline
Lesen Sie es, um zu sehen, welche Befehlszeile verwendet wurde, um den Prozess zu startenenviron
die Umgebungsvariablen für diesen Prozessroot
ein Link zu dem, was der Prozess als sein Root-Verzeichnis betrachtet (es wird / sofern nicht chrooted)
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 Ihnen zeigen, wer was gegabelt hat, damit Sie eine bessere Vorstellung davon bekommen, wer Ihr Perl aufruft.
Lösung 2:
In den meisten Fällen wird einfach ps
ausgeführt ist normalerweise ausreichend, zusammen mit Ihren Lieblingsflaggen, um eine breite Ausgabe zu ermöglichen. Ich tendiere zu ps -feww
, aber die anderen Vorschläge hier werden funktionieren. Beachten Sie, dass wenn ein Programm von jemandes $PATH
gestartet wurde , sehen Sie nur den Namen der ausführbaren Datei, nicht den vollständigen Pfad. 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 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 dies in eine Datei namens "myprogram" kompiliere und ausführe:
$ gcc -o myprogram myprogram.c
$ ./myprogram &
[1] 10201
Und führen Sie dann ps
aus , sehe ich 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 unter /proc/<pid>/exe
nachsehen , die ein symbolischer Link zur entsprechenden ausführbaren Datei sein kann. 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
Lösung 3:
für mich habe ich gerade diesen pstree
gefunden gab einen viel klareren Hinweis darauf, wie ein Prozess gestartet wurde, als ps aux
sieht so aus:
├─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} ]
Lösung 4:
Sie können verwenden:
systemctl status <PID>
oder mit dem Namen des Prozesses:
systemctl status $(pgrep perl)
Dies liefert Informationen zu systemd-Diensten, die Ihren Prozess gestartet haben.
Ich habe diesen Hinweis hier gefunden
Lösung 5:
Versuchen Sie es mit ps axww | grep perl
um die vollständige Befehlszeile Ihres Prozesses zu erhalten. Es sieht aus wie top
habe gerade eine lange Linie abgeschnitten.