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

Вы можете иметь tcpdump зарегистрируйте весь порт 53 UDP и действие TCP.

180
10.10.2013, 03:52
6 ответов

Существует 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
233
27.01.2020, 19:27

Я предполагаю, что у Вас есть идентификатор процесса в pid. Большинство методов в большинстве систем потребует, чтобы оболочка, от которой Вы делаете это, работала как тот же пользователь как целевой процесс (или корень).

На Linux и Солярисе и возможно некоторых других нельдах System V:

cd /proc/$pid/cwd && pwd

На Linux (кроме встроенных систем, где readlink не доступно), но не Солярис:

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
27
27.01.2020, 19:27
  • 1
    , включающая детали о перемещении. Хороший небольшой самородок для добавления к сайту! –  slm♦ 10.10.2013, 03:56
  • 2
    Можете Вы комментировать вообще повсеместность pwdx на другом Unixes? –  slm♦ 10.10.2013, 04:00
  • 3
    На OpenBSD, по крайней мере, lsof только сообщает о точке монтирования CWD процесса. –  kurtm 10.10.2013, 04:11
  • 4
    @slm pwdx присутствует на Солярисе с 20-го века, Linux с середины 2000-х (подражающий Солярису, говорится в странице справочника). Не существующий на любом другом Unix AFAIK. –  Gilles 'SO- stop being evil' 10.10.2013, 04:12
  • 5
    @kurtm - какой-либо лучший метод на BSD? Также pwdx там? –  slm♦ 10.10.2013, 04:17

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

readlink -e /proc/$$/cwd

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

9
27.01.2020, 19:27

Основано на ответе @Gilles..

если вы знаете PID вашего процесса.. для Mac OSX и Linux используйте:

lsof -p PID | awk '$4=="cwd" {print $9}'

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

1
27.01.2020, 19:27

Для macOS :Если вы знаете PID и хотите получить точный файл/каталог (нет другой информации )используйте:

lsof -a -p 1234 -d cwd -F n | tail -1 | cut -c2-

-a:Укажите lsof присоединиться, используя И вместо ИЛИ для опций -pи -dниже
-p:идентификатор процесса (pid )1234
-d:включать только файловый дескриптор, cwd
-F:Укажите поля для вывода (выберите из списка символов здесь)

Символ n, переданный в параметр -F, выводит 3 элемента, разделенных символами новой строки. Нам нужен только последний (текущий рабочий каталог ). Мы передаем вывод в tail, чтобы получить последнюю строку, а затем передаем его в cut, чтобы обрезать первый символ.

2
14.10.2020, 19:10

Во FreeBSD вы можете использовать:

procstat -f <PID> | grep cwd
1
28.11.2021, 19:19

Теги

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