查找生成进程的文件路径

查找生成进程的文件路径

我使用的是 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是该进程的工作目录的符号链接。也就是说,如果我python ./example.py~/tmp/python, in运行,ps我会看到:

$ 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

看起来我们正在运行一些完全无害的东西。

相关内容