
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 readlink
nã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.