What command(s) can one use to find out the current working directory (CWD) of a running process? These would be commands you could use externally from the process.
7 Answers
There are 3 methods that I'm aware of:
pwdx
$ pwdx <PID>
lsof
$ lsof -p <PID> | grep cwd
/proc
$ readlink -e /proc/<PID>/cwd
Examples
Say we have this process.
$ pgrep nautilus
12136
Then if we use pwdx
:
$ pwdx 12136
12136: /home/saml
Or you can use lsof
:
$ lsof -p 12136 | grep cwd
nautilus 12136 saml cwd DIR 253,2 32768 10354689 /home/saml
Or you can poke directly into the /proc
:
$ readlink -e /proc/12136/cwd/
/home/saml

- 369,824
I assume that you have the process ID in pid
. Most methods on most systems will require that the shell you're doing this from is running as the same user as the target process (or root).
On Linux and Solaris and perhaps some other System V unices:
cd /proc/$pid/cwd && pwd
On Linux (except embedded systems where readlink
is not available) but not Solaris:
readlink /proc/$pid/cwd
On just about any unix variant, you can use lsof
. Beware that if there is a newline, it will be printed as \n
(indistinguishable from backslash followed by n
). If you feel lucky, you can use the second form, which silently chokes on all whitespace in the directory name.
lsof -a -Fn -p $pid -d cwd | sed -e '1d' -e '2s/^n/'
lsof -p $pid | awk '$4=="cwd" {print $9}'
Bonus: if you need to cause a process to change its current directory, you can do it with a debugger. This is useful for example to move a long-running program that doesn't care about its current directory out of a directory that you want to remove. Not all programs appreciate having their current directory changed under their feet — for example a shell is likely to crash.
#!/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

- 829,060
-
Nice touch adding the details in about moving. Good little nugget to add to the site! – slm Oct 10 '13 at 00:56
-
-
On OpenBSD, at least, lsof only reports the mount point of the process's CWD. – kurtm Oct 10 '13 at 01:11
-
@slm
pwdx
is present on Solaris since the 20th century, Linux since the mid-2000s (imitating Solaris, says the man page). Not present on any other unix AFAIK. – Gilles 'SO- stop being evil' Oct 10 '13 at 01:12 -
-
@slm Not that I found so far.
pwdx
is not on there, and unless it's part of a package, I don't see a package for it.fuser
is like lsof but it only takes a file or mount point and tell you which processes have it open (or have files open on that filesystem). It's an interesting blind spot. – kurtm Oct 10 '13 at 02:06 -
@slm on FreeBSD you can view current directory using procstat:
procstat -f PID
and look for cwd. – citrin Nov 08 '17 at 19:12
If your system has /proc
, you can always do:
readlink -e /proc/$$/cwd
If you want to find out the CWD from a different process than the one you're interested in, you obviously need to replace $$
with the PID of your process of interest.

- 39,549
For macOS: If you know the PID and want to get the exact file/directory (no other information) use:
lsof -a -p 1234 -d cwd -F n | tail -1 | cut -c2-
-a
: Tell lsof to join using AND instead of OR for the -p
and -d
options below
-p
: pass in process id (pid) 1234
-d
: only include the file descriptor, cwd
-F
: Specify the fields to output (choose from the list of characters here)
The n
character passed to -F
option outputs 3 things separated by newlines. We only want the last one (the current working directory). We pipe the output into tail
to get the last line then pipe it into cut
to trim the first character.

- 189
-
Note that you still need to decode that output as
lsof
encodes control character, backslash and the bytes of some non-ASCII characters using\xHH
,\b
,\n
,\\
etc notation. – Stéphane Chazelas Feb 26 '23 at 13:04
Based @Gilles answer..
if you know PID of your process.. for Mac OSX and Linux use:
lsof -p PID | awk '$4=="cwd" {print $9}'
to get working dir of process..

- 111
-
lsof: WARNING: can't stat() tracefs file system /sys/kernel/debug/tracing Output information may be incomplete.
Anyone else get this? – Sridhar Sarnobat Apr 26 '20 at 05:42 -
1@SridharSarnobat, you can always add the
-w
options to suppress those warnings. – Stéphane Chazelas Feb 26 '23 at 13:05
For those who want a more "visual" solution (useful if you want to check a lot of processes, but still works from the terminal):
- use the command
htop
(might need to be installed first), - select process with up-down arrows,
- press e to show the process environment,
- press F4 and filter for
PWD
.
(If To stop the processes change place all the time, you can press Shift+Z.)

- 101
-
-
Note that that shows the
$PWD
environment variable in the environment the process received in the last execve() system call it performed which is not guaranteed to be the same as the current working directory of the process. – Stéphane Chazelas Feb 26 '23 at 13:10
/proc
. – reinierpost Oct 10 '13 at 09:30pwdx
works for me. – aroth Feb 08 '16 at 07:11pgrep <process-name>
– Madhusoodan P May 08 '18 at 14:18root
privileges. At least in OpenBSD, you can see this answer to my U&L question. – Paul Jul 27 '21 at 15:12ps -ef | grep pid
? – cokedude Sep 21 '21 at 06:25