Risposte:
Esistono 3 metodi di cui sono a conoscenza:
$ pwdx <PID>
$ lsof -p <PID> | grep cwd
$ readlink -e /proc/<PID>/cwd
Supponiamo di avere questo processo.
$ pgrep nautilus
12136
Quindi se usiamo pwdx
:
$ pwdx 12136
12136: /home/saml
Oppure puoi usare lsof
:
$ lsof -p 12136 | grep cwd
nautilus 12136 saml cwd DIR 253,2 32768 10354689 /home/saml
Oppure puoi infilare direttamente nel /proc
:
$ readlink -e /proc/12136/cwd/
/home/saml
/proc
.
pwdx
per me va bene.
pgrep <process-name>
Presumo che tu abbia l'ID processo in pid
. La maggior parte dei metodi sulla maggior parte dei sistemi richiede che la shell da cui stai eseguendo sia in esecuzione come lo stesso utente del processo di destinazione (o root).
Su Linux e Solaris e forse alcuni altri sistemi V:
cd /proc/$pid/cwd && pwd
Su Linux (eccetto i sistemi integrati dove readlink
non è disponibile) ma non Solaris:
readlink /proc/$pid/cwd
In quasi tutte le varianti di unix, puoi usare lsof
. Attenzione che se c'è una nuova riga, verrà stampata come \n
(indistinguibile dalla barra rovesciata seguita da n
). Se ti senti fortunato, puoi usare il secondo modulo, che soffoca silenziosamente su tutti gli spazi bianchi nel nome della directory.
lsof -a -Fn -p $pid -d cwd | sed -e '1d' -e '2s/^n/'
lsof -p $pid | awk '$4=="cwd" {print $9}'
Bonus: se devi fare in modo che un processo cambi la sua directory corrente, puoi farlo con un debugger. Ciò è utile, ad esempio, per spostare un programma di lunga durata a cui non interessa la sua directory corrente da una directory che si desidera rimuovere. Non tutti i programmi apprezzano il fatto che la loro directory attuale sia cambiata sotto i loro piedi, ad esempio è probabile che una shell si blocchi.
#!/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
altri Unix?
pwdx
è presente su Solaris dal 20 ° secolo, Linux dalla metà degli anni 2000 (imitando Solaris, dice la pagina man). Non presente su nessun altro AFAIK unix.
pwdx
lì?
Basato sulla risposta di @Gilles ..
se conosci il PID del tuo processo .. per Mac OSX e Linux usa:
lsof -p PID | awk '$4=="cwd" {print $9}'
per far funzionare il dir del processo ..