Jawaban:
Ada 3 metode yang saya ketahui:
$ pwdx <PID>
$ lsof -p <PID> | grep cwd
$ readlink -e /proc/<PID>/cwd
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
/proc
.
pwdx
bekerja untukku.
pgrep <process-name>
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 readlink
yang 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
pwdx
di Unix lain?
pwdx
hadir di Solaris sejak abad ke-20, Linux sejak pertengahan 2000-an (meniru Solaris, kata halaman manual). Tidak hadir pada AFAIK unix lainnya.
pwdx
ada?
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 ..