실행 중인 프로세스의 현재 작업 디렉터리(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}'
프로세스의 작업 디렉터리를 가져옵니다..