実行中のプロセスのファイル名を使用するスクリプトを書いています。しかし、満杯いくつかのプロセスの実行可能ファイル名。
当初、私はName
のエントリ/proc/PID/status
(または の2番目のフィールド/proc/PID/stat
)を照会することにしました。しかし、マニュアルページ、そのフィールドは常に 15 文字に切り捨てられますが、競合や混乱を避けるためにフルネームが必要です。
答えはこの質問を使用することを推奨しています/proc/PID/cmdline
が、問題もあります。一部のプログラム (例: chromium、electron) は の値に対して愚かな/賢い処理を実行する/proc/PID/cmdline
ため、man ページで推奨されているように、 でデータを分割してプログラム名を直接取得することはできませんNULL
。元の argv[0] フィールドに多くの情報が入力され、スペースで区切られます。パス/ファイル名にスペースが含まれる可能性があるため、単にスペースで分割するのは良い選択ではないと思います。
/usr/bin/python /path/to/script
一部のスクリプト (例: Python スクリプト) がフォーム内にあり、一部がフォーム内にあることがわかった場合、これはさらに複雑になります/path/to/script
。ただし、そのフィールド (上記のような詰まりなし) があり、手動で確認して分割する限り、これははるかに簡単に処理できます。
完全なプログラム名/ファイル名を取得する方法はありますか? 名前に完全なパスが含まれているかどうかは問題ではありません。簡単に処理できるからです (今のところ)。
答え1
/proc/$PID/exe
あなたが探しているもののようです:(proc(5)
/proc/[pid]/exe
Linux 2.2 以降では、このファイルは実行されたコマンドの実際のパス名を含むシンボリック リンクです。このシンボリック リンクは通常どおり参照解除できます。このリンクを開こうとすると、実行可能ファイルが開きます。
つまり、単純に言えば:
$ /bin/cat & readlink /proc/$!/exe
/bin/cat
実際には、実行可能ファイルの名前変更に従います。
/tmp$ cp /bin/cat . ; ./cat & mv cat dog ; readlink /proc/$!/exe
/tmp/dog
答え2
procfs-2 をサポートする標準を備えたプラットフォームではprocfs
、次の方法で結果が得られます。
ls -l /proc/<pid>/path/a.out
ファイル a.out はバイナリの絶対パスへのシンボリック リンクです。
この質問では Linux については触れられていないことに注意してください。このため、procfs
procfs の発明者である Roger Faulkner による元の実装でこの機能がどのように動作するかについて情報を提供するのは理にかなっています。