빌드 프로세스의 파일 경로 찾기

빌드 프로세스의 파일 경로 찾기

저는 데비안 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즉, , in 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

우리는 전혀 무해한 일을 하고 있는 것 같습니다.

관련 정보