特定のプログラムを実行しているプログラムを見つけるにはどうすればよいでしょうか?

特定のプログラムを実行しているプログラムを見つけるにはどうすればよいでしょうか?

どのプログラムがスクリプトを実行しているかを調べる方法はありますか?

私はウィンドウ マネージャーとして I3 を実行しており、i3config の代わりに bynd キーを使用したいのですsxkhdが、何かが sxkhd bynd を置き換え続けるので、それが何なのかをトレースしたいです。使用できるかもしれませんstraceが、方法がわかりません。

回答ありがとうございます

編集:
古いプロセスを終了していなかったsxkhdため、スクリプトの実行はそれらによって行われたことが判明しました
が、これらの実行をどのように追跡できるかはまだわかりません。

答え1

Linux では、変数または /proc/pid/status から親プロセスの PID を取得できます$PPID。親プロセスは、たとえばデーモンの場合、常に呼び出しプロセスであるとは限りませんが、通常は呼び出しプロセスです。そうは言っても、すべてのプログラムを、最初に親プロセスの PID をファイルに記録してから元のバイナリを実行するラッパーに変換できます。私は sxkhd を使用しませんが、X11 を使用しているので、例として xeyes を使用します。xeyes次の内容のスクリプトを作成し、実行可能にします。

#!/usr/bin/env sh

printf "PPID: %d\n" "$PPID" >> /tmp/XEYES_RUN
xeyes.orig "$@"

ここで、元の xeyes バイナリの名前を xeyes.orig に変更します。

sudo mv "$(command -v xeyes)" "$(dirname $(command -v xeyes))"/xeyes.orig

オリジナルxeyesをスクリプト ラッパーに置き換えます。

sudo cp ./xeyes "$(dirname $(command -v xeyes.orig))"

通常通り通話するxeyes:

xeyes

これで、xeyes を実行するたびに、その親プロセスの PID が /tmp/XEYES_RUN に追加されます。コマンド ラインから起動する場合は、シェルの PID (例: /bin/bash) になります。

答え2

Linux のシェルから:

readlink "/proc/$PPID/exe"

どの標準シェルでも、$PPID変数は親プロセスを参照します。C では、 で取得できますgetppid()。ほとんどの言語には、変数を取得する方法があります (例: getppidperl、os.getppidpython など)。

親プロセスのPIDを取得したら、それを実行可能ファイルにマッピングするのはシステム固有のものになります。psプロセス名またはコマンドライン引数が表示されますが、それらは信頼できませんこれらは (通常) 完全なパスを含まず、プロセス自体、または同じユーザーとして実行されている他のプロセスによって変更される可能性があるためです。

Linux では、プロセスの実行可能ファイルは によってポイントされます/proc/<pid>/exe。これは「魔法の」シンボリックリンクです。元の実行可能ファイルが削除されたり名前が変更されたりしても、それを読み取ったり (たとえば、別の場所にコピーしたり)、再度実行したりできます。

関連情報