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


167

실행중인 프로세스의 현재 작업 디렉토리 (CWD)를 찾기 위해 어떤 명령을 사용할 수 있습니까? 이는 프로세스에서 외부 적으로 사용할 수있는 명령입니다.

답변:


217

내가 알고있는 3 가지 방법이 있습니다.

pwdx

$ pwdx <PID>

lsof

$ 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
나는 / proc가 정식이며 lsof가 유용하다고 말하지만 pwdx는 멋지다.
ChuckCottrill

3
모든 Unices가있는 것은 아닙니다 /proc.
reinierpost


1
pwdx나를 위해 작동합니다.
aroth

다음은 간단한 방법입니다 (slm의 답변에서) pwdxpgrep <process-name>
Madhusoodan P

27

에 프로세스 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

이동에 대한 세부 사항을 추가하는 멋진 터치. 사이트에 추가하기 좋은 작은 너겟!
slm

pwdx다른 유닉스 의 편재성에 대해 전혀 언급 할 수 있습니까 ?
slm

OpenBSD에서 최소한 lsof는 프로세스 CWD의 마운트 지점 만보고합니다.
kurtm

@slm pwdx은 20 세기 중반부터 Solaris에 존재하며 2000 년대 중반부터 Linux에 존재합니다 (Solaris를 모방하여 매뉴얼 페이지 참조). 다른 유닉스 AFAIK에는 없습니다.
Gilles

@kurtm-BSD에서 더 나은 방법은 무엇입니까? 또한 pwdx있습니까?
slm

9

시스템에이 있으면 /proc항상 다음을 수행 할 수 있습니다.

readlink -e /proc/$$/cwd

관심있는 프로세스와 다른 프로세스에서 CWD를 찾으 $$려면 해당 프로세스의 PID 로 대체해야합니다 .


0

@Gilles 답변 기반 ..

프로세스의 PID 를 알고 있다면 Mac OSXLinux 용 :

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

프로세스의 작업 디렉토리를 얻을 수 있습니다 ..

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.