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

134

Que comando (s) pode usar para descobrir o diretório de trabalho atual (CWD) de um processo em execução? Estes seriam comandos que você poderia usar externamente a partir do processo.

    
por slm 10.10.2013 / 02:15

3 respostas

173

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 tenhamos 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 o /proc :

$ readlink -e /proc/12136/cwd/
/home/saml
    
por 10.10.2013 / 02:19
23

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
    
por 10.10.2013 / 02:52
7

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

readlink -e /proc/$$/cwd

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

    
por 10.10.2013 / 02:18