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


167

Які команди (команди) можна використати для з'ясування поточного робочого каталогу (CWD) запущеного процесу? Це були команди, якими ви могли б користуватися зовні з процесу.

Відповіді:


217

Я знаю 3 способи:

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
Я б сказав, що / proc є канонічним, і lsof є корисним, але pwdx - це круто.
ChuckCottrill

3
Далеко не всі уніці є /proc.
reinierpost


1
pwdxпрацює для мене.
aroth

Ось простий спосіб (з відповіді slm) pwdxpgrep <process-name>
Madhusoodan P

27

Я припускаю, що у вас є ідентифікатор процесу 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

Приємний дотик, додаючи деталі про переїзд. Гарний маленький самородок для додання на сайт!
slm

Чи можете ви взагалі коментувати всюдисущість pwdxінших Unixes?
slm

Принаймні, на OpenBSD lsof повідомляє лише про місце монтажу CWD процесу.
kurtm

@slm pwdxприсутній на Solaris з 20 століття, Linux з середини 2000-х (імітуючи Solaris, йдеться на сторінці man). Немає в жодному іншому Unix AFAIK.
Жиль

@kurtm - будь-який кращий метод на BSD? Також є pwdx?
slm

9

Якщо у вас є система /proc, ви завжди можете:

readlink -e /proc/$$/cwd

Якщо ви хочете з’ясувати CWD з іншого процесу, ніж того, що вас цікавить, вам, очевидно, потрібно замінити $$PID вашого цікавого процесу.


0

На основі @Gilles відповіді ..

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

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

щоб отримати робочий dir процесу ..

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.