Aktuelles Arbeitsverzeichnis eines laufenden Prozesses herausfinden?

Aktuelles Arbeitsverzeichnis eines laufenden Prozesses herausfinden?

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 readlinkes 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.

verwandte Informationen