Узнать текущий рабочий каталог запущенного процесса?

Узнать текущий рабочий каталог запущенного процесса?

Какие команды можно использовать для определения текущего рабочего каталога (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}'

чтобы получить рабочий процесс..

Связанный контент