Antworten:
Es gibt 3 Methoden, die mir bekannt sind:
$ pwdx <PID>
$ lsof -p <PID> | grep cwd
$ readlink -e /proc/<PID>/cwd
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
/proc
.
pwdx
funktioniert bei mir.
pgrep <process-name>
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 readlink
nicht 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
pwdx
anderer Unixe sagen?
pwdx
ist seit dem 20. Jahrhundert auf Solaris vertreten, Linux seit Mitte der 2000er Jahre ( laut Manpage imitiert es Solaris). Auf keinem anderen Unix-AFAIK vorhanden.
pwdx
es auch
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 .
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 ..