PID 번호와 작동 폴더를 얻는 방법

PID 번호와 작동 폴더를 얻는 방법

PID 번호와 해당 번호가 있는 폴더를 얻는 방법은 무엇입니까?

다른 폴더에서 동일한 프로그램 2개를 실행하는 경우:

/var/www/public_html/first_folder/test.jar <i>(it runs all the time)</i>
/var/www/public_html/second_folder/test.jar <i>(it runs all the time)</i>

이 명령을 실행하면ps aux | grep test.jar

결과:

www-data  3766  0.5  3.8 2959916 75616 ?       Sl   15:01   0:13 java -jar test.jar

www-data  4239  3.4  4.1 2959916 82432 ?       Sl   15:31   0:18 java -jar test.jar

어떤 PID가 첫 번째 폴더인지 두 번째 폴더인지 모르겠습니다.

답변1

Linux에서는 에서 프로세스의 작업 디렉터리를 찾을 수 있습니다 /proc/$pid/cwd. 이는 작업 디렉토리에 대한 마법의 심볼릭 링크입니다. /proc/$pid/cmdline프로세스의 명령줄이 제공되지만 NUL 바이트로 구분되므로 약간의 처리가 필요합니다. 특정 기준과 일치하는 여러 프로그램의 작업 디렉터리와 명령줄을 얻으려면 다음을 수행할 수 있습니다 pgrep.

for pid in $(pgrep -f test.jar); do
    echo "pid: $pid cwd: $(readlink "/proc/$pid/cwd") cmd: $(tr '\0' ' ' < "/proc/$pid/cmdline")"
done

물론, 예를 들어 PID를 찾기 위해 이미 를 사용하고 있다면 또는 를 ps사용할 수 있습니다 .ls -l /proc/<PID>/cwdreadlink /proc/<PID>/cwd

당신은 또한 사용할 수 있습니다lsof, 그러나 프로그램의 명령줄 인수를 표시하는 방법을 모르겠습니다.

$ lsof -a -d cwd -c cat
COMMAND   PID     USER   FD   TYPE DEVICE SIZE/OFF    NODE NAME
cat     30693 someuser  cwd    DIR  253,1     4096 1700752 /tmp/y
cat     30694 someuser  cwd    DIR  253,1     4096 1700611 /tmp

FreeBSD에서는 fstat명령을 통해서도 사용할 수 있지만 실제 경로를 얻는 것은 조금 더 까다롭고 느립니다.

$(pgrep java)에서 pid를 얻으세요.
    fstat -p "${pid}" | fstat -p "${pid}" | awk '{ if ($4 == "wd") 인쇄 '"${pid}"',$5,$6;
완료 | 읽는 동안 -r pid root inum;
    printf "%s: " "${pid}"
    -x "${root}" -type d -inum "${inum}" 2>/dev/null 찾기
완벽한

답변2

pgrep -x program_name_pattern | xargs pwdx

설명하다

  1. pgrep pattern- 현재 실행 중인 프로세스를 보고 패턴과 일치하는 프로세스 ID를 나열합니다.
    • -x, --정확함- 이름이 패턴과 정확하게 일치하는 프로세스만 일치합니다.
  2. pwdx- 프로세스의 현재 작업 디렉터리를 보고합니다.

시험

pgrep -x my_program | xargs pwdx

###Output###
15880: /home/minimax/Desktop/sandbox
15907: /home/minimax/Desktop/sandbox/yet_one_folder

답변3

lsof당신의 친구가 여기 있습니까:

lsof -c java | grep /var/www/public_html

두 번째 열에는 PID가 표시됩니다.

관련 정보