답변:
내가 알고있는 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
/proc
.
pwdx
나를 위해 작동합니다.
pgrep <process-name>
에 프로세스 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
pwdx
다른 유닉스 의 편재성에 대해 전혀 언급 할 수 있습니까 ?
pwdx
은 20 세기 중반부터 Solaris에 존재하며 2000 년대 중반부터 Linux에 존재합니다 (Solaris를 모방하여 매뉴얼 페이지 참조). 다른 유닉스 AFAIK에는 없습니다.
pwdx
있습니까?