
Ich habe mich gefragt, ob es eine Möglichkeit gibt, nachzuverfolgen, von wo aus ein Befehl in Linux ausgeführt wurde.
Wenn ich beispielsweise ein Skript aufrufe, gibt es eine Möglichkeit, nachzuverfolgen, von wo aus es aufgerufen wurde, etwa von einem Programm oder einem anderen Bash-Skript gestartet?
Antwort1
Wenn Ihr Skript in Bash geschrieben ist, gibt es eine integrierte Variable namens $PPID (kurz für die Prozess-ID des übergeordneten Elements, nehme ich an), mit der Sie herausfinden können, wer Ihr Skript aufgerufen hat. Hier ist ein Beispiel:
CALLER=$(ps ax | grep "^ *$PPID" | awk '{print $NF}')
echo I was called from $CALLER
Erläuterung:
- Die $PPID gibt die Prozess-ID des übergeordneten Prozesses (des Anrufers) an.
- DiepsBefehl listet alle Prozesse auf
- DergrepDer Befehl sucht nach der Zeile, die die PPID am Zeilenanfang enthält
- DerawkDer Befehl druckt nur die letzte Spalte, nämlich den Namen des Anrufers.
Antwort2
"War„Ausführen von“ ist meiner Meinung nach ziemlich schwierig, es sei denn, die ausgeführte ausführbare Datei enthält eine Protokollierung. Wenn die Ausführung abgeschlossen ist, gibt es wahrscheinlich nicht mehr viel zu untersuchen.
Wenn esIstausgeführt wird, können Sie möglicherweise durch einfaches Verwenden von genügend Informationen über den Anrufer aus der ID des übergeordneten Prozesses (PPID) erhalten ps
.
Antwort3
Wenn der Prozess noch läuft, können Sie die vom Befehl angebotene hierarchische Visualisierung (auch Gesamtstruktur oder Prozessbaum genannt) verwenden ps
.
Versuchen Sie zum Beispiel:
ps xf
Und die Ausgabe sieht folgendermaßen aus:
3627 ? Ss 0:00 /bin/dash -f /usr/local/etc/wmii-hg/wmiirc
3655 ? S 0:38 \_ bwm --interface eth0 --download
3656 ? S 0:38 \_ bwm --interface eth0 --upload
3687 ? S 0:20 \_ /bin/dash -f /usr/local/etc/wmii-hg/wmiirc
574 ? S 0:00 | \_ sleep 1
3713 ? S 0:00 \_ wmiir read /event
3714 ? S 0:00 \_ /bin/dash -f /usr/local/etc/wmii-hg/wmiirc
22671 ? S 0:00 \_ /bin/dash -f /usr/local/etc/wmii-hg/wmiirc
22672 ? Ss 0:03 \_ xterm
22673 pts/0 Ss+ 0:00 \_ bash
Antwort4
Eine mögliche Verbesserung zu Hai Vus Antwort:
ps -p $PPID -o args=
Die -p
Beschränkung beschränkt die ps
Ausgabe auf die Prozess-ID des übergeordneten Elements. -o
Damit können Sie Ihre eigene Ausgabe angeben, und in diesem Fall habe ich „which“ (für mich gibt es das, wonach ich suche). Die mögliche Verbesserung besteht darin, dass Sie, anstatt viele Informationen abzurufen und dann zu versuchen, sie zu analysieren, nur nach den gewünschten Informationen args=
fragen .ps
Sobald Sie es haben, $PPID
können Sie auch in den /proc/$PPID/
„Verzeichnissen“ nachsehen, um ausführlichere Informationen zu erhalten.