Shell
找出正在執行的程序的目前工作目錄?
可以使用哪些命令來找出正在執行的程序的目前工作目錄 (CWD)?這些將是您可以在流程外部使用的命令。
我知道有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
我假設您在
pid
. 大多數係統上的大多數方法都要求您從中執行此操作的 shell 以與目標程序(或 root)相同的使用者身份執行。在 Linux 和 Solaris 以及其他一些 System V 上:
cd /proc/$pid/cwd && pwd
在 Linux(不可用的嵌入式系統除外
readlink
)而非 Solaris 上:readlink /proc/$pid/cwd
在幾乎任何 unix 變體上,您都可以使用
lsof
. 請注意,如果有換行符,它將被列印為\n
(與後跟的反斜杠無法區分n
)。如果你覺得幸運,你可以使用第二種形式,它會默默地阻塞目錄名稱中的所有空格。lsof -a -Fn -p $pid -d cwd | sed -e '1d' -e '2s/^n/' lsof -p $pid | awk '$4=="cwd" {print $9}'
獎勵:如果您需要使程序更改其目前目錄,您可以使用調試器來完成。例如,這對於將不關心其目前目錄的長時間執行的程序移出您要刪除的目錄很有用。並不是所有的程序都喜歡在他們的腳下改變他們的目前目錄——例如一個 shell 可能會崩潰。
#!/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