実行中のプロセスの現在の作業ディレクトリ (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
readlink
Linux の場合 (利用できない組み込みシステムを除く)、ただし 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}'
プロセスの作業ディレクトリを取得します。