ビルドプロセスのファイルパスを見つける

ビルドプロセスのファイルパスを見つける

私はDebian 9.13を使用しています。これにより、ps -aux | grep NaughtyProcessName関心のある特定のプロセスに関する情報を次の形式で見つけることができます。

user.name [ID] [CPU USAGE] [%MEM] VSZ RSS TTY STAT START TIME COMMAND

コマンドは次のように表示されます。

path/to/interpreter ./file_name.cmd

file_name.cmdだから私は、いくつかのユーザーが次のようにしてプロセスを作成し、作成した不思議なディレクトリにいると仮定します./file_name.cmd。この手順では、にあるインタプリタを使用しますpath/to/interpreter

このファイルがどのディレクトリにあるかを知りたいです。私が試すことができる唯一のこと

cd /
find -iname file_name.cmd

ただし、時間がかかり、重複したコンテンツが見つかる可能性があります。より良い、より簡単なものはありますか?

ベストアンサー1

プロセスIDが与えられると、そのプロセスの作業ディレクトリへのシンボリックリンクが提供されます<pid>/proc/<pid>/cwdつまり、 、 inpython ./example.pyで実行すると次が表示されます。~/tmp/pythonps

$ ps -f -p 118054
UID          PID    PPID  C STIME TTY          TIME CMD
lars      118054    6793  0 09:16 pts/1    00:00:00 python ./example.py

には/proc/118054/cwd以下が表示されます。

$ ls -l /proc/118054/cwd
lrwxrwxrwx. 1 lars lars 0 Aug 31 09:16 /proc/118054/cwd -> /home/lars/tmp/python

./example.pyしたがって、その情報を使用して言及された内容を推論することができます/home/lars/tmp/python/example.py


ただし、の出力に表示される情報は信頼できませんps。次の簡単なCプログラムを考えてみましょう。

#include <string.h>
#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>

int main(int argc, char **argv[]) {
    pid_t pid = getpid();
    printf("pid %d\n", pid);

    memset(argv[0], ' ', strlen(argv[0]));
    strcpy(argv[0], "ls");
    sleep(600);
    return 0;
}

これを実行すると:

$ ./example
pid 119217

それから見てくださいps

$ ps -f -p 119217
UID          PID    PPID  C STIME TTY          TIME CMD
lars      119217    6793  0 09:25 pts/1    00:00:00 ls

私たちはまったく無害なことをしているようです。

おすすめ記事