Suponho que você tenha o ID do processo em pid
. A maioria dos métodos na maioria dos sistemas exigirá que o shell que você está fazendo seja executado como o mesmo usuário que o processo de destino (ou root).
No Linux e no Solaris e talvez em alguns outros sistemas do System V:
cd /proc/$pid/cwd && pwd
No Linux (exceto sistemas incorporados em que readlink
não está disponível), mas não no Solaris:
readlink /proc/$pid/cwd
Em praticamente qualquer variante do Unix, você pode usar lsof
. Tenha em atenção que, se existir uma nova linha, será impressa como \n
(indistinguível da contrabarra seguida por n
). Se você se sentir com sorte, você pode 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 mude seu diretório atual, poderá fazê-lo com um depurador. Isso é útil, por exemplo, para mover um programa de execução longa que não se importa com o diretório atual de um diretório que você deseja remover. Nem todos os programas apreciam ter seus diretórios atualizados alterados - por exemplo, um shell pode falhar.
#!/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