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?
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:
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:
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
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:
cwd Link zum aktuellen Arbeitsverzeichnis
fd ein Verzeichnis mit Links zu den geöffneten Dateien (Dateideskriptoren)
cmdline Lesen Sie, welche Befehlszeile zum Starten des Prozesses verwendet wurde
environ die Umgebungsvariablen für diesen Prozess
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.
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
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.
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.
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.
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!
/proc
liefern die Dateien alle Informationen über ein Programm,exe
sind eine Verknüpfung zur ausführbaren Datei,cwd
zum aktuellen Arbeitsverzeichnis, dasfd
Verzeichnis enthält Verknüpfungen zu geöffneten Dateien (einschließlich Standardeingabe, -ausgabe und Standardfehler)Am zuverlässigsten ist es, das
/proc
Verzeichnis für den Prozess zu überprüfen. Jeder Prozess verfügt über ein/proc/<pid>/
Verzeichnis, in dem Informationen wie die folgenden gespeichert werden:cwd
Link zum aktuellen Arbeitsverzeichnisfd
ein Verzeichnis mit Links zu den geöffneten Dateien (Dateideskriptoren)cmdline
Lesen Sie, welche Befehlszeile zum Starten des Prozesses verwendet wurdeenviron
die Umgebungsvariablen für diesen Prozessroot
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 auxf
zeigt Ihnen using , wer was gabelte, damit Sie eine bessere Vorstellung davon bekommen, wer Ihr Perl aufruft.quelle
/proc
enthält Prozessinformationen! Wer wusste?? alles, wonach ich dort jemals gesucht habe, warversion
und so weitercpuinfo
... und das löst mein eigentliches Problem, da die Version von ps meines Routers alle Parameter ignoriertchroot()
vorher aufgerufen hat, woher kann ich wissen welchem verzeichnis das/proc/ᴘɪᴅ/cwd
entspricht?Ich fand gerade, dass dies
pstree
einen viel klareren Hinweis darauf gibt, wie ein Prozess gestartet wurde, alsps aux
es sieht aus wie das:
quelle
Versuchen Sie
ps axww | grep perl
, die vollständige Befehlszeile Ihres Prozesses abzurufen. Es sieht so aus, als hätte mantop
gerade eine lange Schlange gezogen.quelle
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.
quelle
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.
quelle
Zwei Befehle fallen mir ein:
1) Ermitteln Sie die Startzeit für den Prozess aus ' ps '.
2) lastcomm , das ich jetzt überprüfe, habe ich nicht installiert. Wie auch immer, die Beschreibung der Manpage lautet:
Aber wie ein paar Leute gesagt haben, "ls -al / proc /" wird Ihnen viel erzählen!
quelle
Sie können verwenden:
oder mit dem Namen des Prozesses:
Dies liefert Informationen zu den Systemdiensten, die Ihren Prozess gestartet haben.
Ich habe diesen Hinweis hier gefunden
quelle