실행 중인 프로세스의 현재 작업 디렉터리를 찾으십니까?

실행 중인 프로세스의 현재 작업 디렉터리를 찾으십니까?

실행 중인 프로세스의 현재 작업 디렉터리(CWD)를 알아내기 위해 어떤 명령을 사용할 수 있나요? 이는 프로세스 외부에서 사용할 수 있는 명령입니다.

답변1

제가 아는 방법은 3가지입니다.

비밀번호

$ pwdx <PID>

이소프

$ lsof -p <PID> | grep cwd

/proc

$ readlink -e /proc/<PID>/cwd

이 프로세스가 있다고 가정해 보겠습니다.

$ pgrep nautilus
12136

그런 다음 다음을 사용하면 pwdx:

$ pwdx 12136
12136: /home/saml

또는 다음을 사용할 수 있습니다 lsof.

$ lsof -p 12136 | grep cwd
nautilus 12136 saml  cwd    DIR              253,2    32768  10354689 /home/saml

또는 다음을 직접 찌를 수도 있습니다 /proc.

$ readlink -e /proc/12136/cwd/
/home/saml

답변2

에 프로세스 ID가 있다고 가정합니다 pid. 대부분의 시스템에서 대부분의 방법을 사용하려면 이 작업을 수행하는 셸이 대상 프로세스(또는 루트)와 동일한 사용자로 실행되고 있어야 합니다.

Linux 및 Solaris 및 기타 System V 유니스의 경우:

cd /proc/$pid/cwd && pwd

Linux에서는( readlink사용할 수 없는 임베디드 시스템 제외) Solaris에서는 제외:

readlink /proc/$pid/cwd

거의 모든 유닉스 변형에서 다음을 사용할 수 있습니다.lsof. 개행 문자가 있으면 \n(백슬래시 뒤에 오는 것과 구별할 수 없음 n)로 인쇄됩니다. 운이 좋다면 디렉터리 이름의 모든 공백을 자동으로 차단하는 두 번째 형식을 사용할 수 있습니다.

lsof -a -Fn -p $pid -d cwd | sed -e '1d' -e '2s/^n/'
lsof -p $pid | awk '$4=="cwd" {print $9}'

보너스: 프로세스가 현재 디렉터리를 변경해야 하는 경우 디버거를 사용하면 됩니다. 이는 예를 들어 현재 디렉터리에 관심이 없는 장기 실행 프로그램을 제거하려는 디렉터리 밖으로 이동하는 데 유용합니다. 모든 프로그램이 현재 디렉토리를 변경하는 것을 좋아하는 것은 아닙니다. 예를 들어 쉘이 충돌할 가능성이 있습니다.

#!/bin/sh

# Use gdb to change the working directory of a process from outside.
# This could be generalized to a lot of other things.

if [ $# -ne 2 ]; then
  echo 1>&2 "Usage: $0 PID DIR"
  exit 120
fi
case "$1" in
  *[!0-9]*) echo 1>&2 "Invalid pid \`$1'"; exit 3;;
esac
case "$2" in
  *[\\\"]*)
    echo 1>&2 "Unsupported character in directory name, sorry."
    exit 3;;
esac

gdb -n -pid "$1" -batch -x /dev/stdin <<EOF
call chdir("$2")
detach
quit
EOF

답변3

시스템에 이 있는 경우 /proc언제든지 다음을 수행할 수 있습니다.

readlink -e /proc/$$/cwd

관심 있는 프로세스가 아닌 다른 프로세스에서 CWD를 찾으려면 분명히 $$관심 있는 프로세스의 PID로 바꿔야 합니다.

답변4

@Gilles 답변을 기반으로 합니다..

당신이 알고 있다면PID귀하의 프로세스에 대해..맥 OS X그리고리눅스사용:

lsof -p PID | awk '$4=="cwd" {print $9}'

프로세스의 작업 디렉토리를 얻으려면 ..

관련 정보