Trace-Linux-Bash-Aufruf

Trace-Linux-Bash-Aufruf

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:

  1. Die $PPID gibt die Prozess-ID des übergeordneten Prozesses (des Anrufers) an.
  2. DiepsBefehl listet alle Prozesse auf
  3. DergrepDer Befehl sucht nach der Zeile, die die PPID am Zeilenanfang enthält
  4. 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 -pBeschränkung beschränkt die psAusgabe auf die Prozess-ID des übergeordneten Elements. -oDamit 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, $PPIDkönnen Sie auch in den /proc/$PPID/„Verzeichnissen“ nachsehen, um ausführlichere Informationen zu erhalten.

verwandte Informationen