¿Qué comando(s) se pueden utilizar para averiguar el directorio de trabajo actual (CWD) de un proceso en ejecución? Estos serían comandos que podría usar externamente desde el proceso.
Respuesta1
Hay 3 métodos que conozco:
pwdx
$ pwdx <PID>
lsof
$ lsof -p <PID> | grep cwd
/proceso
$ readlink -e /proc/<PID>/cwd
Ejemplos
Digamos que tenemos este proceso.
$ pgrep nautilus
12136
Entonces si usamos pwdx
:
$ pwdx 12136
12136: /home/saml
O puedes usar lsof
:
$ lsof -p 12136 | grep cwd
nautilus 12136 saml cwd DIR 253,2 32768 10354689 /home/saml
O puede acceder directamente a /proc
:
$ readlink -e /proc/12136/cwd/
/home/saml
Respuesta2
Supongo que tienes el ID del proceso en formato pid
. La mayoría de los métodos en la mayoría de los sistemas requerirán que el shell desde el que esté haciendo esto se ejecute con el mismo usuario que el proceso de destino (o raíz).
En Linux y Solaris y quizás en algunas otras unidades System V:
cd /proc/$pid/cwd && pwd
En Linux (excepto sistemas integrados donde readlink
no está disponible) pero no en Solaris:
readlink /proc/$pid/cwd
En casi cualquier variante de Unix, puedes usarlsof
. Tenga en cuenta que si hay una nueva línea, se imprimirá como \n
(indistinguible de una barra invertida seguida de n
). Si se siente con suerte, puede utilizar el segundo formulario, que silenciosamente bloquea todos los espacios en blanco en el nombre del directorio.
lsof -a -Fn -p $pid -d cwd | sed -e '1d' -e '2s/^n/'
lsof -p $pid | awk '$4=="cwd" {print $9}'
Bonificación: si necesita hacer que un proceso cambie su directorio actual, puede hacerlo con un depurador. Esto es útil, por ejemplo, para mover un programa de larga ejecución al que no le importa su directorio actual fuera de un directorio que desea eliminar. No todos los programas aprecian que se les cambie el directorio actual; por ejemplo, es probable que un shell falle.
#!/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
Respuesta3
Si su sistema lo tiene /proc
, siempre puede hacer:
readlink -e /proc/$$/cwd
Si desea conocer el CWD de un proceso diferente al que le interesa, obviamente debe reemplazarlo $$
con el PID del proceso de su interés.
Respuesta4
Respuesta basada en @Gilles.
Si usted sabePIDde tu proceso.. paraMac OS Xylinuxusar:
lsof -p PID | awk '$4=="cwd" {print $9}'
para conseguir el directorio de trabajo del proceso.