Scopri l'attuale directory di lavoro di un processo in esecuzione?


168

Quali comandi si possono usare per scoprire l'attuale directory di lavoro (CWD) di un processo in esecuzione? Questi sarebbero comandi che potresti usare esternamente dal processo.

Risposte:


218

Esistono 3 metodi di cui sono a conoscenza:

pwdx

$ pwdx <PID>

lsof

$ lsof -p <PID> | grep cwd

/ proc

$ readlink -e /proc/<PID>/cwd

Esempi

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

2
Direi / proc è canonico, con lsof utile, ma pwdx è bello.
ChuckCottrill,

3
Non tutti gli Unices hanno /proc.
reinierpost,


1
pwdxper me va bene.
aroth

Ecco un modo semplice (dalla risposta di slm) pwdxpgrep <process-name>
Madhusoodan P

27

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 readlinknon è 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

Bel tocco aggiungendo i dettagli sullo spostamento. Buona piccola pepita da aggiungere al sito!
slm

Puoi commentare l'ubiquità di pwdxaltri Unix?
slm

Almeno su OpenBSD, lsof riporta solo il punto di montaggio del CWD del processo.
Kurtm,

@slm 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.
Gilles,

@kurtm - c'è un metodo migliore su BSD? È anche pwdxlì?
slm

9

Se il tuo sistema ha /proc, puoi sempre fare:

readlink -e /proc/$$/cwd

Se vuoi scoprire il CWD da un processo diverso da quello a cui sei interessato, ovviamente devi sostituire $$il PID del tuo processo di interesse.


0

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 ..

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.