
どのプログラムがスクリプトを実行しているかを調べる方法はありますか?
私はウィンドウ マネージャーとして 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()
。ほとんどの言語には、変数を取得する方法があります (例: getppid
perl、os.getppid
python など)。
親プロセスのPIDを取得したら、それを実行可能ファイルにマッピングするのはシステム固有のものになります。ps
プロセス名またはコマンドライン引数が表示されますが、それらは信頼できませんこれらは (通常) 完全なパスを含まず、プロセス自体、または同じユーザーとして実行されている他のプロセスによって変更される可能性があるためです。
Linux では、プロセスの実行可能ファイルは によってポイントされます/proc/<pid>/exe
。これは「魔法の」シンボリックリンクです。元の実行可能ファイルが削除されたり名前が変更されたりしても、それを読み取ったり (たとえば、別の場所にコピーしたり)、再度実行したりできます。