Process-Management

查找產生程序的文件路徑

  • August 31, 2022

我正在使用 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並通過 do 產生了一個程序./file_name.cmd。該過程使用path/to/interpreter.

我想知道這個文件在哪個目錄。我唯一知道我可以嘗試的是

cd /
find -iname file_name.cmd

但這需要時間,並且可能會找到重複項。有沒有更好更直接的方法?

給定一個程序 id <pid>,然後/proc/<pid>/cwd是該程序工作目錄的符號連結。也就是說,如果我python ./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

看起來我們正在執行一些完全無害的東西。

引用自:https://unix.stackexchange.com/questions/715625