Wie findet man heraus, welches Programm ein bestimmtes Programm ausführt?

Wie findet man heraus, welches Programm ein bestimmtes Programm ausführt?

Gibt es eine Möglichkeit herauszufinden, welches Programm mein Skript ausführt?

Ich verwende I3 als Fenstermanager und möchte sxkhddie 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, straceaber ich habe noch nicht herausgefunden, wie.

Danke für Antworten

EDIT:
Es stellte sich heraus, dass ich meine alten Prozesse nicht beendet hatte, sxkhdalso 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 $PPIDder 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 xeyesein 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 xeyesdurch 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 $PPIDbezieht 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. getppidin Perl, os.getppidin Python usw.).

Sobald Sie die PID des übergeordneten Prozesses haben, ist die Zuordnung zu einer ausführbaren Datei systemspezifisch. pswird 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.

verwandte Informationen