Cari tahu direktori kerja saat ini dari proses yang sedang berjalan?

168

Perintah apa yang dapat digunakan seseorang untuk mengetahui direktori kerja saat ini (CWD) dari proses yang sedang berjalan? Ini akan menjadi perintah yang bisa Anda gunakan secara eksternal dari proses.

slm
sumber

Jawaban:

218

Ada 3 metode yang saya ketahui:

pwdx

$ pwdx <PID>

lsof

$ lsof -p <PID> | grep cwd

/ proc

$ readlink -e /proc/<PID>/cwd

Contohnya

Katakanlah kita memiliki proses ini.

$ pgrep nautilus
12136

Maka jika kita menggunakan pwdx:

$ pwdx 12136
12136: /home/saml

Atau Anda dapat menggunakan lsof:

$ lsof -p 12136 | grep cwd
nautilus 12136 saml  cwd    DIR              253,2    32768  10354689 /home/saml

Atau Anda dapat menyodok langsung ke /proc:

$ readlink -e /proc/12136/cwd/
/home/saml
slm
sumber
2
Saya akan mengatakan / proc kanonik, dengan lsof berguna, tetapi pwdx keren.
ChuckCottrill
3
Tidak semua Unix memiliki /proc.
reinierpost
Pertanyaan serupa namun berbeda: unix.stackexchange.com/questions/173868/…
Sibbs Gambling
1
pwdxbekerja untukku.
Agustus
Ini adalah cara sederhana (dari jawaban slm) pwdxpgrep <process-name>
Madhusoodan P
27

Saya berasumsi bahwa Anda memiliki ID proses dalam pid. Sebagian besar metode pada kebanyakan sistem akan mengharuskan shell yang Anda gunakan menjalankan sebagai pengguna yang sama dengan proses target (atau root).

Di Linux dan Solaris dan mungkin beberapa persatuan Sistem V lainnya:

cd /proc/$pid/cwd && pwd

Di Linux (kecuali sistem embedded readlinkyang tidak tersedia) tetapi tidak Solaris:

readlink /proc/$pid/cwd

Pada hampir semua varian unix, Anda dapat menggunakan lsof. Hati-hati bahwa jika ada baris baru, itu akan dicetak sebagai \n(tidak dapat dibedakan dari garis miring terbalik diikuti oleh n). Jika Anda merasa beruntung, Anda dapat menggunakan formulir kedua, yang secara diam-diam tersedak di semua spasi putih dalam nama direktori.

lsof -a -Fn -p $pid -d cwd | sed -e '1d' -e '2s/^n/'
lsof -p $pid | awk '$4=="cwd" {print $9}'

Bonus: jika Anda perlu menyebabkan proses untuk mengubah direktori saat ini, Anda dapat melakukannya dengan debugger. Ini berguna misalnya untuk memindahkan program yang berjalan lama yang tidak peduli dengan direktori saat ini dari direktori yang ingin Anda hapus. Tidak semua program menghargai perubahan direktori saat ini di bawah kaki mereka - sebagai contoh shell kemungkinan besar akan crash.

#!/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
sumber
Sentuhan yang bagus menambahkan detail dalam tentang bergerak. Nugget kecil yang bagus untuk ditambahkan ke situs!
slm
Bisakah Anda berkomentar sama sekali tentang di mana-mana pwdxdi Unix lain?
slm
Pada OpenBSD, setidaknya, hanya melaporkan titik mount CWD proses.
kurtm
@slm pwdxhadir di Solaris sejak abad ke-20, Linux sejak pertengahan 2000-an (meniru Solaris, kata halaman manual). Tidak hadir pada AFAIK unix lainnya.
Gilles
@kurtm - ada metode yang lebih baik pada BSD? Juga pwdxada?
slm
9

Jika sistem Anda memiliki /proc, Anda selalu dapat melakukan:

readlink -e /proc/$$/cwd

Jika Anda ingin mengetahui CWD dari proses yang berbeda dari yang Anda minati, Anda jelas perlu mengganti $$dengan PID dari proses yang Anda minati.

Joseph R.
sumber
0

Berdasarkan jawaban @Gilles ..

jika Anda tahu PID proses Anda .. untuk Mac OSX dan Linux gunakan:

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

untuk mendapatkan dir dari proses ..

Dariusz Filipiak
sumber