Відповіді:
Я знаю 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
/proc
.
pwdx
працює для мене.
pgrep <process-name>
Я припускаю, що у вас є ідентифікатор процесу pid
. Більшість методів у більшості систем вимагають, щоб оболонка, з якої ви це робите, працювала тим самим користувачем, що і цільовий процес (або root).
Про Linux та Solaris та, можливо, деякі інші системи 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
pwdx
інших Unixes?
pwdx
присутній на Solaris з 20 століття, Linux з середини 2000-х (імітуючи Solaris, йдеться на сторінці man). Немає в жодному іншому Unix AFAIK.
pwdx
?
На основі @Gilles відповіді ..
якщо ви знаєте PID вашого процесу .. для використання Mac OSX та Linux :
lsof -p PID | awk '$4=="cwd" {print $9}'
щоб отримати робочий dir процесу ..