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.
Je connais 3 méthodes:
$ pwdx <PID>
$ lsof -p <PID> | grep cwd
$ readlink -e /proc/<PID>/cwd
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
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.
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 ..