This is to troubleshoot some problems related to environment variables ..

On Windows, I could do this by using tool such as ProcessExplorer to select particular process and view values of each environment variable. How can I accomplish the same thing on Unix? echoing and env cmd just show values at present time, but I want to view what values the running process is using currently?

Thanks in advance!

link|improve this question
Even though /proc/<pid>/environ has a size of 0, there's still information in there. "It makes more sense if you think of it as a window into the kernel. The file doesn't actually contain any data; it just acts as a pointer to where the actual process information resides." [source] – nevets1219 Jun 10 '11 at 17:45
feedback

8 Answers

up vote 23 down vote accepted
cat /proc/<pid>/environ

If you want to have pid(s) of a given running executable you can, among a number of other possibility, use pidof:

AlberT$ pidof sshd   
30690 6512

EDIT:

I totally quote @Teddy comment to achieve a more readable output:

xargs --null --max-args=1 echo < /proc/self/environ
link|improve this answer
3  
To make it readable, convert the nulls to newlines: cat /proc/17330/environ | tr \\0 \\n – Dennis Williamson Sep 17 '09 at 19:14
5  
I always do xargs --null --max-args=1 echo < /proc/PID/environ – Teddy Oct 29 '09 at 13:08
better use strings, its fast. Cat is still faster :-) – Nikhil Mulley Jan 14 at 19:37
feedback

Since this question has a unix tag and everyone else has done such a great job addressing linux tag, you can get this information on OS X and other BSD-derived systems using

ps -p <PID> -wwwe

or

ps -p <PID> -wwwE

and on Solaris with

/usr/ucb/ps -wwwe <PID>
link|improve this answer
I I run ps -p <PID> -wwwe on OS X 10.6 I get the list of all running processes. the right command is with -E flag, not -e. – AlberT Sep 18 '09 at 8:17
I realized that -e is equal to -E only if ps is in legacy mode – AlberT Sep 18 '09 at 8:21
I tested on OS X 10.4, but not 10.5. Updated accordingly. – Gerald Combs Sep 18 '09 at 15:23
feedback
cat /proc/PID/environ

replace PID with the PID of the process you want to see. Every information about a running process is under /proc/PID/ directory

example: cat /proc/32512/environ

link|improve this answer
feedback

Under Linux, I'd try having a look at

/proc/<pid>/environ
link|improve this answer
feedback

As others have mentioned, on Linux, you can look in /proc but there are, depending on your kernel version, one or two limits:

First of all, the environ file contains the environment as it looked when the process was spawned. That means that any changes the process might have made to its environment will not be visible in /proc:

$ cat /proc/$$/environ | wc -c
320
$ bash
$ cat /proc/$$/environ | wc -c
1270
$

The first shell is a login shell and initially has a very limited environment but grows it by sourcing e.g. .bashrc but /proc does not reflect this. The second shell inherits the larger environment from the start, which it why it shows in /proc.

Also, on older kernels, the contents of the environ file is limited to a page size (4K):

$ cat /proc/$$/environ | wc -c
4096
$ env | wc -c
10343
$

Somewhere between 2.6.9 (RHEL4) and 2.6.18 (RHEL5) this limit was removed...

link|improve this answer
feedback

correct usage of BSD options to do this (at least on linux):

ps e $pid

or

ps auxe  #for all processes

and yes, ps manpage is pretty confusing. (via)

link|improve this answer
feedback

And since my job makes me be an AIX fan boy, let us not forget:

ps eww [pid]

Or as the man page calls it, "Berkeley Standards".

For whatever reason, /proc/PID/environ does not exist in AIX.

link|improve this answer
feedback

For Solaris 5.10, this works:

pargs -e <PID>
link|improve this answer
feedback

Your Answer

 
or
required, but never shown

Not the answer you're looking for? Browse other questions tagged or ask your own question.