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

Какие команды можно использовать для поиска текущего рабочего каталога (CWD) для текущего процесса? Это будут команды, которые вы могли бы использовать извне из процесса.

119 голосов | спросил slm 10 +04002013-10-10T04:15:59+04:00312013bEurope/MoscowThu, 10 Oct 2013 04:15:59 +0400 2013, 04:15:59

3 ответа


156

Есть 3 метода, о которых я знаю:

pwdx

$ 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
ответил slm 10 +04002013-10-10T04:19:38+04:00312013bEurope/MoscowThu, 10 Oct 2013 04:19:38 +0400 2013, 04:19:38
22

Я предполагаю, что у вас есть идентификатор процесса в 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
ответил Gilles 10 +04002013-10-10T04:52:34+04:00312013bEurope/MoscowThu, 10 Oct 2013 04:52:34 +0400 2013, 04:52:34
7

Если ваша система имеет /proc, вы всегда можете:

readlink -e /proc/$$/cwd

Если вы хотите узнать CWD из другого процесса, кроме интересующего вас, вам, очевидно, нужно заменить $$ на PID вашего процесса интереса.

ответил Joseph R. 10 +04002013-10-10T04:18:11+04:00312013bEurope/MoscowThu, 10 Oct 2013 04:18:11 +0400 2013, 04:18:11

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132