
Gibt es eine Möglichkeit herauszufinden, welches Programm mein Skript ausführt?
Ich verwende I3 als Fenstermanager und möchte sxkhd
die Bynd-Schlüssel anstelle von i3config verwenden, aber irgendetwas ersetzt ständig meine sxkhd-Bynds, also möchte ich herausfinden, was das ist. Vielleicht könnte ich es verwenden, strace
aber ich habe noch nicht herausgefunden, wie.
Danke für Antworten
EDIT:
Es stellte sich heraus, dass ich meine alten Prozesse nicht beendet hatte, sxkhd
also waren sie für die Ausführung meines Skripts verantwortlich
, aber ich bin immer noch neugierig, wie ich diese Ausführungen verfolgen kann
Antwort1
Unter Linux können Sie die PID des übergeordneten Prozesses aus $PPID
der Variable oder /proc/pid/status abrufen. Der übergeordnete Prozess ist beispielsweise im Fall von Daemons nicht immer ein aufrufender Prozess, aber normalerweise schon. Davon abgesehen können Sie jedes Programm in einen Wrapper umwandeln, der zuerst die PID seines übergeordneten Prozesses in eine Datei protokolliert und dann eine Original-Binärdatei ausführt. Ich verwende nicht sxkhd, aber da Sie X11 verwenden, verwenden wir als Beispiel xeyes. Erstellen Sie xeyes
ein Skript mit dem folgenden Inhalt und machen Sie es ausführbar:
#!/usr/bin/env sh
printf "PPID: %d\n" "$PPID" >> /tmp/XEYES_RUN
xeyes.orig "$@"
Benennen Sie nun eine ursprüngliche Xeyes-Binärdatei in xeyes.orig um:
sudo mv "$(command -v xeyes)" "$(dirname $(command -v xeyes))"/xeyes.orig
Ersetzen Sie das Original xeyes
durch einen Skript-Wrapper:
sudo cp ./xeyes "$(dirname $(command -v xeyes.orig))"
Normal anrufen xeyes
:
xeyes
Jetzt wird jedes Mal, wenn Sie xeyes ausführen, die PID des übergeordneten Prozesses an /tmp/XEYES_RUN angehängt. Wenn Sie es von der Befehlszeile aus starten, ist es die PID Ihrer Shell, zum Beispiel /bin/bash.
Antwort2
Von der Shell unter Linux:
readlink "/proc/$PPID/exe"
In jeder Standard-Shell $PPID
bezieht sich die Variable auf den übergeordneten Prozess. In C können Sie sie mit abrufen getppid()
. In den meisten Sprachen gibt es eine Möglichkeit, sie abzurufen (z. B. getppid
in Perl, os.getppid
in Python usw.).
Sobald Sie die PID des übergeordneten Prozesses haben, ist die Zuordnung zu einer ausführbaren Datei systemspezifisch. ps
wird Ihnen den Prozessnamen oder die Befehlszeilenargumente mitteilen, aber diese sindnicht zuverlässig, da sie (im Allgemeinen) nicht den vollständigen Pfad enthalten und vom Prozess selbst oder von jedem anderen Prozess, der unter dem gleichen Benutzer ausgeführt wird, geändert werden können.
Unter Linux wird auf die ausführbare Datei eines Prozesses durch verwiesen /proc/<pid>/exe
. Das ist ein „magischer“ symbolischer Link: Selbst wenn die ursprüngliche ausführbare Datei entfernt oder umbenannt wurde, können Sie sie immer noch lesen (z. B. um sie an einen anderen Ort zu kopieren) oder erneut ausführen.