Re: env in background process

2000-09-26 Thread Doug MacEachern

On Mon, 14 Aug 2000, Niraj Sheth wrote:

 Hi,
 
 I am having very strange problem with environment variables.
 
 From Apache::PerlRun script(cgi) I am setting env and firing background
 process ..
 system("$command ") (or print `$command `;)
 
 now looks like environment variable being persistence b/w different
 requests ONLY in background process. so it's looks to me that mod_perl
 is setting proper "Perl Level" env but failing to reset env at "c level"
 or "process level". I know it's sounds very weird.
 /perl-status?env is printing correctly but my background process
 ($command) is printing few extra env, which i set it in different cgi
 script.
 
 e.g. "script1.pl" is setting $ENV{foo1} = "foo1" and firing print
 `command1 `;
 and "script2.pl" is setting $ENV{foo2} = "foo2" and firing print
 `command2 `;
 
 after few hits both env(foo1 and foo2) are visible to both background
 processes.
 while /perl-status?env is displaying correctly.
 Here command1 and command2(perl scripts) are just printing env
 
 Apache/1.3.9 (Unix) mod_perl/1.21

with the test case below, i get the expected results:

env is missing MOD_PERL

all of %ENV should be inherited except for this one.  if you have a
small test case that i can drop in and run (small like the one below),
i'll take a look.

my $r = shift;

$r-send_http_header;

local $ENV{PATH} = '/usr/bin';

$ENV{PACKAGE} = __PACKAGE__;

my @env = `env`;
my %env;

for (@env) {
chomp;
my($k,$v) = split '=';
$env{$k} = $v;
}

while (my($k,$v) = each %ENV) {
next if exists $env{$k};
print "env is missing $k\n";
}






RE: env in background process

2000-09-26 Thread Doug MacEachern

On Tue, 15 Aug 2000, Niraj Sheth wrote:
 
 so why dump_env is getting both?
 If I either uncomment "local %ENV = %ENV;" in script or put "%ENV = ();"
 in PerlCleanupHandler then dump_env is working fine.
 I tried both Apache::PerlRun and Apache::Registry which same result.

oh whoops, you did send a test case.  i think the problem is that mod_perl
only clears the Perl side of %ENV, so the underlying C environ array is
not modified.  if we do that than other problems pop up.  the best
approach for the moment is to use:

local $ENV{FOO1} = 'foo1';

print `dump_env`;




RE: env in background process

2000-09-26 Thread Sheth, Niraj

Thanks for looking at it.

I prefer "%ENV = ();" in PerlCleanupHandler handler. (as i don't have to
modify so many scripts).
I don't think it has any negative effect ...

-Niraj

 -Original Message-
 From: Doug MacEachern [mailto:[EMAIL PROTECTED]]
 Sent: Tuesday, September 26, 2000 3:32 PM
 To: Niraj Sheth
 Cc: [EMAIL PROTECTED]
 Subject: RE: env in background process
 
 
 On Tue, 15 Aug 2000, Niraj Sheth wrote:
  
  so why dump_env is getting both?
  If I either uncomment "local %ENV = %ENV;" in script or put 
 "%ENV = ();"
  in PerlCleanupHandler then dump_env is working fine.
  I tried both Apache::PerlRun and Apache::Registry which same result.
 
 oh whoops, you did send a test case.  i think the problem is 
 that mod_perl
 only clears the Perl side of %ENV, so the underlying C 
 environ array is
 not modified.  if we do that than other problems pop up.  the best
 approach for the moment is to use:
 
 local $ENV{FOO1} = 'foo1';
 
 print `dump_env`;
 



RE: env in background process

2000-08-30 Thread Doug MacEachern

On Wed, 23 Aug 2000, Sheth, Niraj  wrote:

 Didn't get any reply yet on this, so I think i am doing something very
 stupid ...

i'm still catching up with plenty of unanswered mail in my modperl
mailbox, including yours, doing the best i can.




RE: env in background process

2000-08-23 Thread Sheth, Niraj

Didn't get any reply yet on this, so I think i am doing something very
stupid ...

Can anyone try it and tell me if gets the same result?

Thanks,
Niraj

 -Original Message-
 From: Niraj Sheth [mailto:[EMAIL PROTECTED]]
 Sent: Tuesday, August 15, 2000 11:03 AM
 To: [EMAIL PROTECTED]
 Subject: RE: env in background process
 
 
 Follow up on this.
 
 script1.pl(set FOO1 env)
 ===
 #!/usr/local/bin/perl
 
 print "Content-type: text/html\n\n";
 print "PID = $$BR\n";
 print "SCRIPT1 with FOO1BR\n";
 
 #local %ENV = %ENV;
 
 $ENV{FOO1} = "foo1";
 print map { "$_ = $ENV{$_}BR\n"; } sort keys %ENV;
 
 $command = "dump_env";
 print `$command `; # put it in the background
 
 -- end
 
 script2.pl(set FOO2 env)
 ===
 #!/usr/local/bin/perl
 
 print "Content-type: text/html\n\n";
 print "PID = $$BR\n";
 print "SCRIPT1 with FOO2BR\n";
 
 #local %ENV = %ENV;
 
 $ENV{FOO2} = "foo2";
 print map { "$_ = $ENV{$_}BR\n"; } sort keys %ENV;
 
 $command = "dump_env";
 print `$command `; # put it in the background
 
 -- end
 
 dump_env
 ===
 #!/usr/local/bin/perl
 
 print "$0 @ARGV\n";
 
 print map { "$0 $_ = $ENV{$_}BR\n"; } sort keys %ENV;
 
 --end
 
 running "httpd -X" i will get FOO1 and FOO2 both from the print
 statement of dum_env.
 while script1.pl is ONLY printing FOO1 which is correct as well as
 script2.pl is ONLY printing FOO2 which is also correct.
 
 so why dump_env is getting both?
 If I either uncomment "local %ENV = %ENV;" in script or put 
 "%ENV = ();"
 in PerlCleanupHandler then dump_env is working fine.
 I tried both Apache::PerlRun and Apache::Registry which same result.
 
 I would appreciate any help.
 
 -Niraj
 
  -Original Message-
  From: Niraj Sheth [mailto:[EMAIL PROTECTED]]
  Sent: Monday, August 14, 2000 12:10 PM
  To: [EMAIL PROTECTED]
  Subject: env in background process
 
 
  Hi,
 
  I am having very strange problem with environment variables.
 
  From Apache::PerlRun script(cgi) I am setting env and firing
  background
  process ..
  system("$command ") (or print `$command `;)
 
  now looks like environment variable being persistence b/w different
  requests ONLY in background process. so it's looks to me 
 that mod_perl
 
  is setting proper "Perl Level" env but failing to reset env
  at "c level"
  or "process level". I know it's sounds very weird.
  /perl-status?env is printing correctly but my background process
  ($command) is printing few extra env, which i set it in 
 different cgi
  script.
 
  e.g. "script1.pl" is setting $ENV{foo1} = "foo1" and firing print
  `command1 `;
  and "script2.pl" is setting $ENV{foo2} = "foo2" and firing print
  `command2 `;
 
  after few hits both env(foo1 and foo2) are visible to both 
 background
  processes.
  while /perl-status?env is displaying correctly.
  Here command1 and command2(perl scripts) are just printing env
 
  Apache/1.3.9 (Unix) mod_perl/1.21
  Summary of my perl5 (5.0 patchlevel 5 subversion 3) configuration:
Platform:
  osname=solaris, osvers=2.6, archname=sun4-solaris
  uname='sunos nlsun268 5.6 generic_105181-14 sun4u sparc
  sunw,ultra-4
  '
  hint=recommended, useposix=true, d_sigaction=define
  usethreads=undef useperlio=undef d_sfio=undef
Compiler:
  cc='gcc', optimize='-O', gccversion=2.8.1
  cppflags='-I/usr/local/include'
  ccflags ='-I/usr/local/include'
  stdchar='unsigned char', d_stdstdio=define, usevfork=false
  intsize=4, longsize=4, ptrsize=4, doublesize=8
  d_longlong=define, longlongsize=8, d_longdbl=define,
  longdblsize=16
  alignbytes=8, usemymalloc=y, prototype=define
Linker and Libraries:
  ld='gcc', ldflags =' -L/usr/local/lib'
  libpth=/usr/local/lib /lib /usr/lib /usr/ccs/lib
  libs=-lsocket -lnsl -ldl -lm -lc -lcrypt
  libc=/lib/libc.so, so=so, useshrplib=false, libperl=libperl.a
Dynamic Linking:
  dlsrc=dl_dlopen.xs, dlext=so, d_dlsymun=undef, ccdlflags=' '
  cccdlflags='-fPIC', lddlflags='-G -L/usr/local/lib'
 
 
  Any comments?
 
  Thanks,
  Niraj
 
 



RE: env in background process

2000-08-15 Thread Niraj Sheth

Follow up on this.

script1.pl(set FOO1 env)
===
#!/usr/local/bin/perl

print "Content-type: text/html\n\n";
print "PID = $$BR\n";
print "SCRIPT1 with FOO1BR\n";

#local %ENV = %ENV;

$ENV{FOO1} = "foo1";
print map { "$_ = $ENV{$_}BR\n"; } sort keys %ENV;

$command = "dump_env";
print `$command `; # put it in the background

-- end

script2.pl(set FOO2 env)
===
#!/usr/local/bin/perl

print "Content-type: text/html\n\n";
print "PID = $$BR\n";
print "SCRIPT1 with FOO2BR\n";

#local %ENV = %ENV;

$ENV{FOO2} = "foo2";
print map { "$_ = $ENV{$_}BR\n"; } sort keys %ENV;

$command = "dump_env";
print `$command `; # put it in the background

-- end

dump_env
===
#!/usr/local/bin/perl

print "$0 @ARGV\n";

print map { "$0 $_ = $ENV{$_}BR\n"; } sort keys %ENV;

--end

running "httpd -X" i will get FOO1 and FOO2 both from the print
statement of dum_env.
while script1.pl is ONLY printing FOO1 which is correct as well as
script2.pl is ONLY printing FOO2 which is also correct.

so why dump_env is getting both?
If I either uncomment "local %ENV = %ENV;" in script or put "%ENV = ();"
in PerlCleanupHandler then dump_env is working fine.
I tried both Apache::PerlRun and Apache::Registry which same result.

I would appreciate any help.

-Niraj

 -Original Message-
 From: Niraj Sheth [mailto:[EMAIL PROTECTED]]
 Sent: Monday, August 14, 2000 12:10 PM
 To: [EMAIL PROTECTED]
 Subject: env in background process


 Hi,

 I am having very strange problem with environment variables.

 From Apache::PerlRun script(cgi) I am setting env and firing
 background
 process ..
 system("$command ") (or print `$command `;)

 now looks like environment variable being persistence b/w different
 requests ONLY in background process. so it's looks to me that mod_perl

 is setting proper "Perl Level" env but failing to reset env
 at "c level"
 or "process level". I know it's sounds very weird.
 /perl-status?env is printing correctly but my background process
 ($command) is printing few extra env, which i set it in different cgi
 script.

 e.g. "script1.pl" is setting $ENV{foo1} = "foo1" and firing print
 `command1 `;
 and "script2.pl" is setting $ENV{foo2} = "foo2" and firing print
 `command2 `;

 after few hits both env(foo1 and foo2) are visible to both background
 processes.
 while /perl-status?env is displaying correctly.
 Here command1 and command2(perl scripts) are just printing env

 Apache/1.3.9 (Unix) mod_perl/1.21
 Summary of my perl5 (5.0 patchlevel 5 subversion 3) configuration:
   Platform:
 osname=solaris, osvers=2.6, archname=sun4-solaris
 uname='sunos nlsun268 5.6 generic_105181-14 sun4u sparc
 sunw,ultra-4
 '
 hint=recommended, useposix=true, d_sigaction=define
 usethreads=undef useperlio=undef d_sfio=undef
   Compiler:
 cc='gcc', optimize='-O', gccversion=2.8.1
 cppflags='-I/usr/local/include'
 ccflags ='-I/usr/local/include'
 stdchar='unsigned char', d_stdstdio=define, usevfork=false
 intsize=4, longsize=4, ptrsize=4, doublesize=8
 d_longlong=define, longlongsize=8, d_longdbl=define,
 longdblsize=16
 alignbytes=8, usemymalloc=y, prototype=define
   Linker and Libraries:
 ld='gcc', ldflags =' -L/usr/local/lib'
 libpth=/usr/local/lib /lib /usr/lib /usr/ccs/lib
 libs=-lsocket -lnsl -ldl -lm -lc -lcrypt
 libc=/lib/libc.so, so=so, useshrplib=false, libperl=libperl.a
   Dynamic Linking:
 dlsrc=dl_dlopen.xs, dlext=so, d_dlsymun=undef, ccdlflags=' '
 cccdlflags='-fPIC', lddlflags='-G -L/usr/local/lib'


 Any comments?

 Thanks,
 Niraj