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>/cwd
readlink /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
설명하다
pgrep pattern
- 현재 실행 중인 프로세스를 보고 패턴과 일치하는 프로세스 ID를 나열합니다.- -x, --정확함- 이름이 패턴과 정확하게 일치하는 프로세스만 일치합니다.
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가 표시됩니다.