回答:
私が知っている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
ほぼすべてのUNIXバリアントで、を使用できますlsof
。改行がある場合、\n
(バックスラッシュとそれに続くn
)と区別できないように印刷されることに注意してください。運がよければ、2番目の形式を使用できます。これは、ディレクトリ名のすべての空白を静かにチョークします。
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
他のUnix での普遍性についてコメントできますか?
pwdx
は20世紀からSolarisに存在し、Linuxは2000年代半ばから存在しています(Solarisを模倣している、manページによると)。他のUnix AFAIKには存在しません。
pwdx
ありますか?
ベースの@Gillesの回答..
プロセスのPIDを知っている場合.. Mac OSXおよびLinuxの場合:
lsof -p PID | awk '$4=="cwd" {print $9}'
プロセスの作業ディレクトリを取得します。