web-dev-qa-db-ja.com

実行中のプロセスの現在の作業ディレクトリを見つけますか?

実行中のプロセスの現在の作業ディレクトリ(CWD)を見つけるには、どのコマンドを使用できますか?これらは、プロセスの外部で使用できるコマンドです。

185
slm

私が知っている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
243
slm

pidにプロセスIDがあると思います。ほとんどのシステムのほとんどのメソッドでは、これを実行しているシェルがターゲットプロセス(またはルート)と同じユーザーとして実行されている必要があります。

LinuxとSolaris、そしておそらく他のいくつかのSystem V unices:

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

システムに/procがある場合は、いつでも実行できます。

readlink -e /proc/$$/cwd

興味のあるプロセスとは異なるプロセスからCWDを検索する場合は、$$を興味のあるプロセスのPIDに置き換える必要があります。

9
Joseph R.

ベースの@Gilles回答..

あなたが知っているなら [〜#〜] pid [〜#〜] あなたのプロセスの.. forMac OSXLinux使用:

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

プロセスの作業ディレクトリを取得します。

0