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

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

실행 중인 프로세스의 현재 작업 디렉터리(CWD)를 찾는 데 사용할 수 있는 명령은 무엇입니까? 프로세스 외부에서 사용할 수 있는 명령입니다.

답변1

나는 3가지 방법을 알고 있습니다.

비밀번호

$ pwdx <PID>

라소프

$ lsof -p <PID> | grep cwd

/프로세스

$ 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

거의 모든 Unix 변형에서 사용할 수 있습니다.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당신의 프로세스..for애플 컴퓨터그리고리눅스사용:

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

프로세스의 작업 디렉터리를 가져옵니다..

관련 정보