Çalışan bir işlemin geçerli çalışma dizinini bulun?


167

Çalışan bir işlemin geçerli çalışma dizinini (CWD) bulmak için hangi komutları kullanabilirsiniz? Bunlar, işlemden harici olarak kullanabileceğiniz komutlar olacaktır.

Yanıtlar:


217

Farkında olduğum 3 yöntem var:

pwdx

$ pwdx <PID>

lsof

$ lsof -p <PID> | grep cwd

/ proc

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

Örnekler

Diyelim ki bu süreç bizde.

$ pgrep nautilus
12136

O zaman kullanırsak pwdx:

$ pwdx 12136
12136: /home/saml

Veya kullanabilirsiniz lsof:

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

Veya doğrudan içine sokabilirsiniz /proc:

$ readlink -e /proc/12136/cwd/
/home/saml

2
Bence / proc kanoniktir, ancak yararlı olur, ancak pwdx iyidir.
ChuckCottrill

3
Bütün Unices'de yok /proc.
reinierpost


1
pwdxbenim için çalışıyor.
saat

İşte basit bir yol (slm'in cevabından) pwdxpgrep <process-name>
Madhusoodan P

27

İşlem kimliğinin sizde olduğunu varsayıyorum pid. Çoğu sistemdeki çoğu yöntem, bunu yaptığınız kabuğun hedef işlem (veya kök) ile aynı kullanıcı olarak çalışmasını gerektirir.

Linux ve Solaris ve belki de bazı diğer System V unices'de:

cd /proc/$pid/cwd && pwd

Linux'ta ( readlinkmevcut olmayan gömülü sistemler hariç ) ancak Solaris'te:

readlink /proc/$pid/cwd

Hemen hemen tüm Unix varyantlarında kullanabilirsiniz lsof. Yeni bir satır varsa, bunun \narkasından (ters eğik çizgiden ayırt edilemez) basılacağına dikkat edin n. Kendinizi şanslı hissediyorsanız, dizin adındaki tüm boşluklarda sessizce boğulan ikinci formu kullanabilirsiniz.

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

Bonus: Mevcut dizini değiştirmek için bir işlem yapmanız gerekiyorsa, bunu bir hata ayıklayıcı ile yapabilirsiniz. Bu, örneğin mevcut diziniyle ilgilenmeyen uzun süren bir programı kaldırmak istediğiniz dizinden çıkarmak için kullanışlıdır. Tüm programlar mevcut dizinin ayaklarının altında değiştiğini takdir etmez - örneğin bir kabuğun çökmesi olasıdır.

#!/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

Taşınma hakkında ayrıntılar ekleyerek hoş bir dokunuş. Siteye eklemek için iyi küçük külçe!
slm

pwdxDiğer Unix'lerin her yerde bulunup bulunmadığı hakkında yorum yapabilir misiniz ?
slm

OpenBSD'de, en azından, lsof sadece işlemin CWD'sinin bağlantı noktasını bildirir.
kurtm

@slm pwdx20. yüzyıldan bu yana Solaris üzerinde mevcut olduğu, Linux 2000'li yılların ortalarından itibaren (Solaris taklit manuel sayfa). Diğer unix AFAIK'lerde yoktur.
Gilles

@kurtm - BSD'de daha iyi bir yöntem var mı? Ayrıca pwdxorada mı?
slm

9

Sisteminizde varsa /proc, şunları yapabilirsiniz:

readlink -e /proc/$$/cwd

CWD'yi ilgilendiğinizden farklı bir işlemden öğrenmek istiyorsanız, ilgilendiğiniz işlemin PID'sini değiştirmeniz gerekir $$.


0

@Gilles cevabı dayanarak ..

Prosesinizin PID'sini biliyorsanız .. Mac OSX ve Linux kullanımı için:

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

işlemin direktörlüğünü yapmak için ..

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.