Вы можете иметь tcpdump
зарегистрируйте весь порт 53 UDP и действие TCP.
Существует 3 метода, о которых я знаю:
$ pwdx <PID>
$ 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
Я предполагаю, что у Вас есть идентификатор процесса в 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
pwdx
присутствует на Солярисе с 20-го века, Linux с середины 2000-х (подражающий Солярису, говорится в странице справочника). Не существующий на любом другом Unix AFAIK.
– Gilles 'SO- stop being evil'
10.10.2013, 04:12
Если Ваша система имеет /proc
, можно всегда делать:
readlink -e /proc/$$/cwd
Если Вы хотите узнать CWD от другого процесса, чем тот, Вы интересуетесь, очевидно, необходимо заменить $$
с PID Вашего процесса интереса.
Для 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
, чтобы обрезать первый символ.
Во FreeBSD вы можете использовать:
procstat -f <PID> | grep cwd
/proc
. – reinierpost 10.10.2013, 12:30pwdx
работы для меня. – aroth 08.02.2016, 09:11