Respostas:
Existem três métodos que eu conheço:
$ pwdx <PID>
$ lsof -p <PID> | grep cwd
$ readlink -e /proc/<PID>/cwd
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 cutucar diretamente no /proc
:
$ readlink -e /proc/12136/cwd/
/home/saml
/proc
.
pwdx
funciona para mim.
pgrep <process-name>
Presumo que você tenha o ID do processo pid
. A maioria dos métodos na maioria dos sistemas exigirá que o shell do qual você está fazendo isso esteja sendo executado como o mesmo usuário que o processo de destino (ou raiz).
No Linux e Solaris e talvez em alguns outros sistemas do System V:
cd /proc/$pid/cwd && pwd
No Linux (exceto sistemas incorporados onde readlink
não está disponível), mas não no Solaris:
readlink /proc/$pid/cwd
Em praticamente qualquer variante unix, você pode usar lsof
. Lembre-se de que, se houver uma nova linha, ela será impressa como \n
(indistinguível da barra invertida seguida por n
). Se você tiver sorte, poderá usar o segundo formulário, que silenciosamente engasga com 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, poderá fazê-lo com um depurador. Isso é útil, por exemplo, para mover um programa de longa duração que não se importa com o diretório atual para fora de um diretório que você deseja remover. Nem todos os programas gostam de ter seu diretório atual alterado sob seus pés - por exemplo, um shell provavelmente trava.
#!/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
pwdx
outros Unixes?
pwdx
está presente no Solaris desde o século 20, Linux desde meados dos anos 2000 (imitando o Solaris, diz a página de manual). Não está presente em nenhum outro AFAIK unix.
pwdx
existe?
Resposta baseada no @Gilles ..
se você conhece o PID do seu processo .. para Mac OSX e Linux, use:
lsof -p PID | awk '$4=="cwd" {print $9}'
para começar a trabalhar dir do processo ..