web-dev-qa-db-fra.com

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

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

185
slm

Je connais 3 méthodes:

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

Ensuite, si nous utilisons 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 piquer directement dans le /proc:

$ readlink -e /proc/12136/cwd/
/home/saml
243
slm

Je suppose que vous avez l'ID de processus dans pid. La plupart des méthodes sur la plupart des systèmes nécessitent que le shell à partir duquel vous effectuez cette opération s'exécute en tant que même utilisateur que le processus cible (ou root).

Sous Linux et Solaris et peut-être quelques autres unités System V:

cd /proc/$pid/cwd && pwd

Sous Linux (sauf les systèmes embarqués où readlink n'est pas disponible) mais pas Solaris:

readlink /proc/$pid/cwd

Sur à peu près n'importe quelle variante Unix, vous pouvez utiliser lsof . Attention, s'il y a une nouvelle ligne, elle sera imprimée comme \n (indiscernable de la barre oblique inverse suivie de n). Si vous vous sentez chanceux, vous pouvez utiliser le deuxième formulaire, qui s'étouffe silencieusement sur tous les espaces dans le 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 change son répertoire actuel, vous pouvez le faire avec un débogueur. Cela est utile par exemple pour déplacer un programme de longue durée qui ne se soucie pas de son répertoire actuel hors d'un répertoire que vous souhaitez supprimer. Tous les programmes n'apprécient pas que leur répertoire actuel soit changé sous leurs pieds - par exemple, un Shell est susceptible 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

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

readlink -e /proc/$$/cwd

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

9
Joseph R.

Basé sur @Gilles réponse ..

si vous connaissez PID de votre processus .. pour Mac OSX et Linux utilisez:

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

pour obtenir dir dir de processus ..

0
Dariusz Filipiak