Aktuelles Arbeitsverzeichnis eines laufenden Prozesses herausfinden?

167

Mit welchen Befehlen kann das aktuelle Arbeitsverzeichnis (CWD) eines laufenden Prozesses ermittelt werden? Dies wären Befehle, die Sie außerhalb des Prozesses verwenden könnten.

slm
quelle

Antworten:

217

Es gibt 3 Methoden, die mir bekannt sind:

pwdx

$ pwdx <PID>

lsof

$ lsof -p <PID> | grep cwd

/ proc

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

Beispiele

Sagen wir, wir haben diesen Prozess.

$ pgrep nautilus
12136

Wenn wir dann verwenden pwdx:

$ pwdx 12136
12136: /home/saml

Oder Sie können verwenden lsof:

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

Oder Sie stöbern direkt in /proc:

$ readlink -e /proc/12136/cwd/
/home/saml
slm
quelle
2
Ich würde sagen, / proc ist kanonisch, wobei lsof nützlich ist, aber pwdx ist cool.
ChuckCottrill
3
Nicht alle Unices haben /proc.
Reinierpost
Eine ähnliche, aber andere Frage: unix.stackexchange.com/questions/173868/…
Sibbs Gambling
1
pwdxfunktioniert bei mir.
Am
Hier ist ein einfacher Weg (aus der Antwort von slm): pwdxpgrep <process-name>
Madhusoodan P
27

Ich gehe davon aus, dass Sie die Prozess-ID in haben pid. Die meisten Methoden auf den meisten Systemen setzen voraus, dass die Shell, von der aus Sie dies tun, als derselbe Benutzer wie der Zielprozess (oder Root) ausgeführt wird.

Unter Linux und Solaris und möglicherweise einigen anderen System V-Unices:

cd /proc/$pid/cwd && pwd

Unter Linux (mit Ausnahme von Embedded-Systemen, auf denen dies readlinknicht verfügbar ist), jedoch nicht unter Solaris:

readlink /proc/$pid/cwd

Auf fast jeder Unix-Variante können Sie verwenden lsof. Beachten Sie, dass eine neue Zeile gedruckt wird als \n(nicht von Backslash zu unterscheiden, gefolgt von n). Wenn Sie sich glücklich schätzen, können Sie das zweite Formular verwenden, mit dem alle Leerzeichen im Verzeichnisnamen stillschweigend unterdrückt werden.

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

Bonus: Wenn Sie einen Prozess veranlassen müssen, sein aktuelles Verzeichnis zu ändern, können Sie dies mit einem Debugger tun. Dies ist beispielsweise nützlich, um ein Programm mit langer Laufzeit, das sich nicht um das aktuelle Verzeichnis kümmert, aus einem Verzeichnis zu verschieben, das Sie entfernen möchten. Nicht alle Programme schätzen es, wenn ihr aktuelles Verzeichnis unter ihren Füßen geändert wird - zum Beispiel ist es wahrscheinlich, dass eine Shell abstürzt.

#!/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
quelle
Nette Geste, die Details über das Bewegen hinzufügt. Gutes kleines Nugget, das man der Site hinzufügen kann!
slm
Kannst du überhaupt etwas zur Allgegenwart pwdxanderer Unixe sagen?
slm
Zumindest unter OpenBSD gibt lsof nur den Mount-Punkt der CWD des Prozesses an.
Kurtm
@slm pwdxist seit dem 20. Jahrhundert auf Solaris vertreten, Linux seit Mitte der 2000er Jahre ( laut Manpage imitiert es Solaris). Auf keinem anderen Unix-AFAIK vorhanden.
Gilles
@kurtm - Gibt es eine bessere Methode für BSD? Gibt pwdxes auch
slm
9

Wenn Ihr System über Folgendes verfügt /proc, können Sie immer Folgendes tun:

readlink -e /proc/$$/cwd

Wenn Sie die CWD aus einem anderen Prozess als dem, an dem Sie interessiert sind, ermitteln möchten, müssen Sie diese natürlich durch $$die PID Ihres interessierenden Prozesses ersetzen .

Joseph R.
quelle
0

Basierend auf @Gilles Antwort ..

Wenn Sie die PID Ihres Prozesses kennen, verwenden Sie für Mac OSX und Linux :

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

Arbeitsdir des Prozesses zu bekommen ..

Dariusz Filipiak
quelle