Descubra o diretório de trabalho atual de um processo em execução?

Descubra o diretório de trabalho atual de um processo em execução?

Quais comandos podem ser usados ​​para descobrir o diretório de trabalho atual (CWD) de um processo em execução? Esses seriam comandos que você poderia usar externamente ao processo.

Responder1

Existem 3 métodos que conheço:

pwdx

$ pwdx <PID>

lsof

$ lsof -p <PID> | grep cwd

/proc

$ readlink -e /proc/<PID>/cwd

Exemplos

Digamos que temos esse processo.

$ pgrep nautilus
12136

Então se usarmos pwdx:

$ pwdx 12136
12136: /home/saml

Ou você pode usar lsof:

$ lsof -p 12136 | grep cwd
nautilus 12136 saml  cwd    DIR              253,2    32768  10354689 /home/saml

Ou você pode acessar diretamente /proc:

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

Responder2

Presumo que você tenha o ID do processo em pid. A maioria dos métodos na maioria dos sistemas exigirá que o shell a partir do qual você está fazendo isso esteja sendo executado pelo mesmo usuário do processo de destino (ou root).

No Linux e Solaris e talvez em alguns outros dispositivos System V:

cd /proc/$pid/cwd && pwd

No Linux (exceto sistemas embarcados onde readlinknão está disponível), mas não no Solaris:

readlink /proc/$pid/cwd

Em praticamente qualquer variante unix, você pode usarlsof. Esteja ciente de que se houver uma nova linha, ela será impressa como \n(indistinguível da barra invertida seguida de n). Se você tiver sorte, poderá usar o segundo formulário, que sufoca silenciosamente todos os espaços em branco no nome do diretório.

lsof -a -Fn -p $pid -d cwd | sed -e '1d' -e '2s/^n/'
lsof -p $pid | awk '$4=="cwd" {print $9}'

Bônus: se você precisar fazer com que um processo altere seu diretório atual, você pode fazer isso com um depurador. Isto é útil, por exemplo, para mover um programa de longa execução que não se importa com seu diretório atual de um diretório que você deseja remover. Nem todos os programas gostam de ter seu diretório atual alterado - por exemplo, é provável que um shell trave.

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

Responder3

Se o seu sistema tiver /proc, você sempre pode fazer:

readlink -e /proc/$$/cwd

Se você quiser descobrir o CWD de um processo diferente daquele em que está interessado, obviamente precisará substituí-lo $$pelo PID do seu processo de interesse.

Responder4

Resposta baseada em @Gilles.

se você conhecePIDdo seu processo.. paraMac OS XeLinuxusar:

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

para obter o diretório de trabalho do processo.

informação relacionada