Take the 2-minute tour ×
Server Fault is a question and answer site for system and network administrators. It's 100% free, no registration required.

google is giving no love on this one today, so I turn to the experts...

I'm currently hacking together a script that relies on the /proc/pid/environ feature in Linux (RHEL 4) to check for a particular environment variable. Trouble is, it seems certain environment variables aren't showing up in there for some reason.

Example:

create some test vars:
$ export T_1=testval TEST_1=testval T=testval TESTING_LONGEST=testval

open a subshell:
$bash

$ cat /proc/self/environ|tr "\0" "\n"|grep testval
TESTVARIABLE_LONGEST=testval
T=testval

hmm... where did T_1 and TEST_1 go?? what rules govern this strange universe?

Thanks in advance, Josh

UPDATE:

I have been able to reproduce this issue on various RHEL versions and with various users, but it seems it is unique to Bash (I'm using 3.0). ksh does not show this behavior.

share|improve this question
    
It seems to work fine on my system. Before you launch your sub-shell run the command export | grep testval and make sure everything really exists. –  Zoredache Apr 16 '10 at 16:32
    
They are there. Perhaps we're looking at an issue with a particular RHEL release. –  Josh Arenberg Apr 16 '10 at 16:44
    
Try a different approach and see if it gives you the same results: grep -z testval /proc/self/environ | xargs -I{} -0 printf \{\}"\n" or set | grep testval –  Dennis Williamson Apr 16 '10 at 17:41
    
Dennis, your first test produces the same result, but the second test shows them, as does 'env|grep testval'. So they are making it into the shell, but not into /proc/pid/environ. –  Josh Arenberg Apr 16 '10 at 17:47
    
Works as expected on my system(s). Bash 3.2, 2.6.24 kernel, Ubuntu 8.04. –  Insyte Apr 16 '10 at 19:02

3 Answers 3

up vote 1 down vote accepted

Have a look at http://serverfault.com/questions/66363/environment-variables-of-a-running-process-on-unix/79463#79463 ; it notes that /proc/*/environ is limited to 4096 bytes on some kernels, and that it doesn't display env vars that were changed in that shell.

share|improve this answer

Try using strings instead of tr. It's much better at finding readable strings than just replacing NULs with newlines.

strings /proc/$$/environ
share|improve this answer

Some files in /proc don't respond well to being read in small blocks. Try something like this instead:

dd if=/proc/self/environ bs=1024k | tr "\0" "\n" | grep testval
share|improve this answer

Your Answer

 
discard

By posting your answer, you agree to the privacy policy and terms of service.

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