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


168

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

回答:


218

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

2
/ procは標準で、lsofは便利ですが、pwdxはクールです。
ChuckCottrill

3
すべてのユニックスが持っているわけではありません/proc
reinierpost

同様の質問ですが、unix.stackexchange.com
Gambling 14

1
pwdx私のために働く。
アロス

ここに簡単な方法があります(slmの答えから)pwdxpgrep <process-name>
Madhusoodan P

27

プロセス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

移動についての詳細を追加する素敵なタッチ。サイトに追加する良い小さなナゲット!
slm

pwdx他のUnix での普遍性についてコメントできますか?
slm

少なくともOpenBSDでは、lsofはプロセスのCWDのマウントポイントのみを報告します。
kurtm

@slm pwdxは20世紀からSolarisに存在し、Linuxは2000年代半ばから存在しています(Solarisを模倣している、manページによると)。他のUnix AFAIKには存在しません。
ジル

@kurtm-BSD上のより良い方法はありますか?またpwdxありますか?
slm

9

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

readlink -e /proc/$$/cwd

興味のあるプロセスとは異なるプロセスからCWDを見つけたい場合は、明らか$$に目的のプロセスのPID に置き換える必要があります。


0

ベースの@Gillesの回答..

プロセスのPIDを知っている場合.. Mac OSXおよびLinuxの場合:

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

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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.