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


168

¿Qué comando (s) se pueden usar 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.

Respuestas:


218

Hay 3 métodos que conozco:

pwdx

$ pwdx <PID>

lsof

$ lsof -p <PID> | grep cwd

/ proc

$ 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 puedes meter directamente en /proc:

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

2
Yo diría que / proc es canónico, con lsof siendo útil, pero pwdx es genial.
ChuckCottrill

3
No todos los Unices tienen /proc.
reinierpost

Una pregunta similar pero diferente: unix.stackexchange.com/questions/173868/…
Sibbs Gambling

1
pwdxfunciona para mi.
Aroth

Aquí hay una manera simple (de la respuesta de slm) pwdxpgrep <process-name>
Madhusoodan P

27

Supongo que tiene la identificación del proceso 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 como el mismo usuario que el proceso de destino (o raíz).

En Linux y Solaris y quizás en algunos otros sistemas System V:

cd /proc/$pid/cwd && pwd

En Linux (excepto los sistemas integrados donde readlinkno está disponible) pero no en Solaris:

readlink /proc/$pid/cwd

En casi cualquier variante de Unix, puede usar lsof. Tenga en cuenta que si hay una nueva línea, se imprimirá como \n(indistinguible de la barra invertida seguida de n). Si se siente afortunado, puede usar la segunda forma, que silencia silenciosamente 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 que no le importa su directorio actual fuera del directorio que desea eliminar. No todos los programas aprecian que su directorio actual cambie bajo sus pies; por ejemplo, es probable que un shell se bloquee.

#!/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

Buen toque agregando los detalles sobre el movimiento. ¡Una pequeña pepita para agregar al sitio!
slm

¿Puedes comentar sobre la ubicuidad de pwdxotros Unixes?
slm

En OpenBSD, al menos, lsof solo informa el punto de montaje del CWD del proceso.
kurtm

@slm pwdxestá presente en Solaris desde el siglo XX, Linux desde mediados de la década de 2000 (imitando Solaris, dice la página del manual). No está presente en ningún otro unix AFAIK.
Gilles

@kurtm: ¿hay algún método mejor en BSD? ¿También pwdxhay?
slm

9

Si su sistema tiene /proc, siempre puede hacer:

readlink -e /proc/$$/cwd

Si desea conocer el CWD desde un proceso diferente al que le interesa, obviamente debe reemplazarlo $$con el PID de su proceso de interés.


0

Basado @Gilles respuesta ..

si conoce el PID de su proceso ... para Mac OSX y Linux use:

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

para obtener el directorio de trabajo del proceso ...

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.