Какие команды можно использовать для определения текущего рабочего каталога (CWD) запущенного процесса? Это команды, которые можно использовать извне процесса.
решение1
Мне известны три метода:
pwdx
$ pwdx <PID>
lsof
$ lsof -p <PID> | grep cwd
/проц
$ 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
Я предполагаю, что у вас есть идентификатор процесса в pid
. Большинство методов в большинстве систем потребуют, чтобы оболочка, из которой вы это делаете, была запущена от того же пользователя, что и целевой процесс (или 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}'
Бонус: если вам нужно заставить процесс изменить свой текущий каталог, вы можете сделать это с помощью отладчика. Это полезно, например, для перемещения долго работающей программы, которая не заботится о своем текущем каталоге, из каталога, который вы хотите удалить. Не все программы любят, когда их текущий каталог меняется у них под ногами — например, оболочка, скорее всего, рухнет.
#!/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..
если вы знаетеПИДвашего процесса.. дляMac OS XиЛинуксиспользовать:
lsof -p PID | awk '$4=="cwd" {print $9}'
чтобы получить рабочий процесс..