
Mit welchen Befehlen kann man das aktuelle Arbeitsverzeichnis (CWD) eines laufenden Prozesses herausfinden? Dies wären Befehle, die Sie extern vom Prozess aus verwenden könnten.
Antwort1
Mir sind drei Methoden bekannt:
pwdx
$ pwdx <PID>
lsof
$ lsof -p <PID> | grep cwd
/proc
$ readlink -e /proc/<PID>/cwd
Beispiele
Nehmen wir an, wir haben diesen Prozess.
$ pgrep nautilus
12136
Wenn wir dann verwenden pwdx
:
$ pwdx 12136
12136: /home/saml
Oder Sie können Folgendes verwenden lsof
:
$ lsof -p 12136 | grep cwd
nautilus 12136 saml cwd DIR 253,2 32768 10354689 /home/saml
Oder Sie können direkt in Folgendes hineinschnuppern /proc
:
$ readlink -e /proc/12136/cwd/
/home/saml
Antwort2
Ich gehe davon aus, dass Sie die Prozess-ID in haben pid
. Die meisten Methoden auf den meisten Systemen erfordern, 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 (außer eingebetteten Systemen, wo readlink
es nicht verfügbar ist), aber nicht unter Solaris:
readlink /proc/$pid/cwd
Auf fast jeder Unix-Variante können Sie verwendenlsof
. Beachten Sie, dass ein Zeilenumbruch wie folgt gedruckt wird \n
(nicht zu unterscheiden von einem Backslash gefolgt von n
). Wenn Sie Glück haben, können Sie die zweite Form verwenden, die alle Leerzeichen im Verzeichnisnamen stillschweigend unterdrückt.
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 dazu bringen müssen, sein aktuelles Verzeichnis zu ändern, können Sie dies mit einem Debugger tun. Dies ist beispielsweise nützlich, um ein lang laufendes Programm, das sich nicht um sein aktuelles 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 – beispielsweise stürzt eine Shell wahrscheinlich ab.
#!/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
Antwort3
Wenn Ihr System über verfügt /proc
, können Sie jederzeit Folgendes tun:
readlink -e /proc/$$/cwd
Wenn Sie den CWD aus einem anderen Prozess als dem, an dem Sie interessiert sind, herausfinden möchten, müssen Sie ihn natürlich $$
durch die PID des Prozesses ersetzen, der Sie interessiert.
Antwort4
Basierend auf der Antwort von @Gilles..
wenn Sie wissenPIDIhres Prozesses.. fürMac OS XUndLinuxverwenden:
lsof -p PID | awk '$4=="cwd" {print $9}'
um das Arbeitsverzeichnis des Prozesses zu erhalten.