¿Descubrir el directorio de trabajo actual de un proceso en ejecución?

¿Descubrir el directorio de trabajo actual de un proceso en ejecución?

¿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 readlinkno 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.

información relacionada