実行中のプロセスの現在の作業ディレクトリを確認しますか?

実行中のプロセスの現在の作業ディレクトリを確認しますか?

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

答え1

私が知っている方法は 3 つあります。

パスワード

$ 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

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

Linux および Solaris、およびおそらく他の System V ユニバースの場合:

cd /proc/$pid/cwd && pwd

readlinkLinux の場合 (利用できない組み込みシステムを除く)、ただし Solaris では利用できません:

readlink /proc/$pid/cwd

ほぼすべてのUNIX系OSでは、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

答え3

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

readlink -e /proc/$$/cwd

関心のあるプロセスとは異なるプロセスから CWD を調べたい場合は、当然、$$関心のあるプロセスの PID に置き換える必要があります。

答え4

@Gilles の回答に基づきます。

あなたが知っていればピッドあなたのプロセスのマックOSXそしてリナックス使用:

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

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

関連情報