hi list,
while doing a silly thing (building a set of HTML files with info from
a DB file), I found that while the apache server was being crawled by
lwp-rget, a lots of zombie shells were being spawned and killed.
top was telling me that there were quite a few processes like:
6766 nobody 2 0 0 0 0 Z 0 0.3 0.0 0:00 sh
<defunct>
(I was looking at top because I was happy thinking how mod_perl was
speeding it all up)
so I checked and rechecked my code, 2 *very* silly cgi scripts hacked
in a hurry, that I renamed from .cgi to .pl so the crawling finished
faster. the scripts are at the bottom, but I don't think you'll find
much there.
needless to say, when run under mod_cgi, no sh is ever spawned, and
when the crawling finished no more spawning took place (3 of the zombie
shells remained, though). So it's definitely something with mod_perl and
Apache::Registry. Maybe the DB_File module has something blame? Don't
really know.
these shells are not attached to any console, and they are sh shells,
while I use bash. queer. If it weren't because the server is
*disconnected* from the 'net I'd think the box was 'rooted'.
I've even got to catch the actuall call to sh from ps:
sh -c /bin/csh -cf 'set nonomatch; glob /table' 2>/de
what can that mean? I'm off to search ...
martin
system specs and scripts : 'Apache/1.3.12 (Unix) mod_perl/1.24'
--------------------------------------------------------------
Summary of my perl5 (5.0 patchlevel 5 subversion 3) configuration:
Platform:
osname=linux, osvers=2.2.5-22smp, archname=i386-linux
uname='linux porky.devel.redhat.com 2.2.5-22smp #1 smp wed jun 2
09:11:51 ed
t 1999 i686 unknown '
hint=recommended, useposix=true, d_sigaction=define
usethreads=undef useperlio=undef d_sfio=undef
Compiler:
cc='cc', optimize='-O2', gccversion=egcs-2.91.66 19990314/Linux
(egcs-1.1.2
release)
cppflags='-Dbool=char -DHAS_BOOL -I/usr/local/include'
ccflags ='-Dbool=char -DHAS_BOOL -I/usr/local/include'
stdchar='char', d_stdstdio=undef, usevfork=false
intsize=4, longsize=4, ptrsize=4, doublesize=8
d_longlong=define, longlongsize=8, d_longdbl=define, longdblsize=12
alignbytes=4, usemymalloc=n, prototype=define
Linker and Libraries:
ld='cc', ldflags =' -L/usr/local/lib'
libpth=/usr/local/lib /lib /usr/lib
libs=-lnsl -ldl -lm -lc -lposix -lcrypt
libc=, so=so, useshrplib=false, libperl=libperl.a
Dynamic Linking:
dlsrc=dl_dlopen.xs, dlext=so, d_dlsymun=undef, ccdlflags='-rdynamic'
cccdlflags='-fpic', lddlflags='-shared -L/usr/local/lib'
Characteristics of this binary (from libperl):
Built under linux
Compiled at Aug 30 1999 23:09:51
@INC:
/usr/lib/perl5/5.00503/i386-linux
/usr/lib/perl5/5.00503
/usr/lib/perl5/site_perl/5.005/i386-linux
/usr/lib/perl5/site_perl/5.005
--------------------------------------------------------------------
script letra.pl:
-------------------------------------------------------------------
#!/usr/bin/perl -w
use strict;
use DB_File;
use CGI;
use URI::Escape;
my $cgi = new CGI;
print $cgi->header();
my $letra = $cgi->param('letra');
my %db;
my $records = 0;
tie (%db, "DB_File", 'voluntarios.db') or die $!;
print '<html><head><link rel="stylesheet"
href="fedefa.css"></head><body>';
print '<table width="600" border="1" bordercolor="#666666"
align="center">';
foreach my $key (sort { lc($a) cmp lc($b) } keys %db){
if ($key =~ /^$letra/io){
$records++;
print '<tr>
<td width="21" bgcolor="#FFDBAD">
<img src="lib/flecha.gif" width="21"
height="20">
</td>
<td bgcolor="#0078B3" width="550">
<b>';
print $cgi->a( {href=>'record.pl?record=' . uri_escape($key)} ,
qq{<font color="#FFFFFF" face="Arial, Helvetica, sans-serif"
size="2">$key</font>});
print '</font></b></td></tr>';
}
};
unless ($records){
$letra = uc $letra;
print '<tr>
<td width="21" bgcolor="#FFDBAD">
<img src="/fedefa/lib/flecha.gif"
width="21" height="20">
</td>
<td bgcolor="#0078B3" width="550">
<b>';
print qq{<font color="#FFFFFF" face="Arial, Helvetica,
sans-serif"
size="2">No hay registros con la letra $letra</font>};
print '</font></b></td></tr>';
}
print '</table>';
print '</body></html>';
----------------------------------------------------------------------
script record.pl
----------------------------------------------------------------------
#!/usr/bin/perl -w
use strict;
use DB_File;
use CGI;
use URI::Escape;
my $cgi = new CGI;
print $cgi->header();
my $record = $cgi->param('record');
my %db;
tie (%db, "DB_File", 'voluntarios.db') or die $!;
print '<html><head><link rel="stylesheet"
href="fedefa.css"></head><body>';
print qq{<table width="350" border="1" bordercolor="#333333"
align="center">
<tr>
<td width="21" bgcolor="#FFDBAD"><img
src="lib/flecha.gif"
width="21" height="20"></td>
<td bgcolor="#0078B3"><font color="#FFFFFF"><b><font
size="2"
face="Arial, Helvetica, sans-serif"> $record
</font></b></font></td>
</tr>
};
print '<tr><td> </td><td valign="top" bgcolor="#CCCCCC">';
# elimino la 1er línea del record
my $data = $db{$record};
$data =~ s/^.+\n//;
$data =~ s/^.+\n//;
print $data;
print '</td></tr>';
print '</table>';
print '</body></html>';
----------------------------------------------------------------------