![查找生成进程的文件路径](https://linux22.com/image/210157/%E6%9F%A5%E6%89%BE%E7%94%9F%E6%88%90%E8%BF%9B%E7%A8%8B%E7%9A%84%E6%96%87%E4%BB%B6%E8%B7%AF%E5%BE%84.png)
我使用的是 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
看起来我们正在运行一些完全无害的东西。