Découvrez le répertoire de travail actuel d'un processus en cours?

168

Quelle commande (s) peut-on utiliser pour connaître le répertoire de travail actuel (CWD) d'un processus en cours d'exécution? Ce sont des commandes que vous pouvez utiliser en externe à partir du processus.

slm
la source

Réponses:

218

Il y a 3 méthodes que je connais:

pwdx

$ pwdx <PID>

lsof

$ lsof -p <PID> | grep cwd

/ proc

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

Exemples

Disons que nous avons ce processus.

$ pgrep nautilus
12136

Alors si on utilise pwdx:

$ pwdx 12136
12136: /home/saml

Ou vous pouvez utiliser lsof:

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

Ou vous pouvez fouiller directement dans le /proc:

$ readlink -e /proc/12136/cwd/
/home/saml
slm
la source
2
Je dirais que / proc est canonique, avec lsof utile, mais pwdx est cool.
ChuckCottrill
3
Tous les Unices ont /proc.
reinierpost
Une question similaire mais différente: unix.stackexchange.com/questions/173868/…
Sibbs Gambling 12/12/14
1
pwdxtravaille pour moi.
aroth
Voici un moyen simple (de la réponse de slm) pwdxpgrep <process-name>
Madhusoodan P
27

Je suppose que vous avez l'ID de processus dans pid. La plupart des méthodes sur la plupart des systèmes requièrent que le shell à partir duquel vous faites cela s'exécute sous le même utilisateur que le processus cible (ou racine).

Sous Linux et Solaris et peut-être d'autres unix System V:

cd /proc/$pid/cwd && pwd

Sous Linux (à l'exception des systèmes intégrés où readlinkn'est pas disponible) mais pas sous Solaris:

readlink /proc/$pid/cwd

Vous pouvez utiliser à peu près n'importe quelle variante unix lsof. Attention, s'il existe une nouvelle ligne, elle sera imprimée sous la forme \n(indiscernable de la barre oblique inverse suivie de n). Si vous vous sentez chanceux, vous pouvez utiliser le deuxième formulaire, qui étouffe silencieusement tous les espaces du nom du répertoire.

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

Bonus: si vous devez faire en sorte qu'un processus modifie son répertoire actuel, vous pouvez le faire avec un débogueur. Ceci est utile par exemple pour déplacer un programme de longue durée qui ne se soucie pas de son répertoire actuel du répertoire que vous souhaitez supprimer. Tous les programmes n'apprécient pas d'avoir leur répertoire actuel changé sous leurs pieds - par exemple, un shell risque de planter.

#!/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
la source
Belle touche en ajoutant les détails dans sur le déménagement. Bonne petite pépite à ajouter sur le site!
slm
Pouvez-vous commenter l'omniprésence des pwdxautres Unix?
slm
Sous OpenBSD, au moins, lsof ne rapporte que le point de montage de la CWD du processus.
Kurtm 10/10
@slm pwdxest présent sur Solaris depuis le 20e siècle, Linux depuis le milieu des années 2000 (imitant Solaris, dit la page de manuel). Non présent sur aucun autre unix autant que je sache.
Gilles
@kurtm - une meilleure méthode sur BSD? Aussi est- pwdxil?
slm
9

Si votre système a /proc, vous pouvez toujours faire:

readlink -e /proc/$$/cwd

Si vous souhaitez connaître le CWD à partir d'un processus différent de celui qui vous intéresse, vous devez évidemment le remplacer $$par le PID de votre processus d'intérêt.

Joseph R.
la source
0

Basé @Gilles répondre ..

Si vous connaissez le PID de votre processus. Pour Mac OSX et Linux :

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

pour obtenir le travail du processus ..

Dariusz Filipiak
la source