Thanks for the suggestion. I tried it with prefork and the problem still occurred. HOWEVER, I then decided to remove all modules down to a minimal example, and discovered that the mere inclusion of the following module:
use Test::MockObject; was causing the segmentation fault after several successful requests, even though no functions whatsoever were called. Since this appears to be a bug in Test::MockObject, I reported the bug here: https://rt.cpan.org/Public/Bug/Display.html?id=73723 The bug report shows the exact minimal handler code that I used to reproduce the bug. Best wishes, David On Tue, 2012-01-03 at 17:26 -0500, Daniel Risacher wrote: > I think I've been bitten by this too, years ago. > > I *think* I solved it by switching to mpm_prefork, which was > unsatisfying, but adequate for my needs. > > On Tue, Jan 3, 2012 at 5:21 PM, David Booth <[email protected]> wrote: > > I tried redirecting stderr to /dev/null and it did not help: > > system("date >> $f 2> /dev/null"); > > > > I am using the worker processing model. Does it work for you (or anyone > > else) without causing periodic child process segmentation faults? > > > > > > On Tue, 2012-01-03 at 16:29 -0500, Daniel Risacher wrote: > >> It's been a while since I looked at doing this, but IIRC it's fairly > >> dependent on the processing model that Apache is using. Are you > >> mpm_prefork, or mpm_worker? > >> > >> Also, I found it was important to redirect stderr to /dev/null: > >> > >> sub play { > >> system "/usr/bin/xmms -t 2> /dev/null"; > >> } > >> > >> > >> On Tue, Jan 3, 2012 at 12:48 PM, David Booth <[email protected]> wrote: > >> > I am trying to run a shell command from a mod_perl2 response handler. > >> > It works properly for some number of HTTP requests, but sometimes it > >> > fails (somewhat randomly) and I see in my Apache2 error log that one of > >> > the Apache2 child processes has died with a segmentation fault. > >> > For example, /var/log/apache2/error.log shows: > >> > > >> > [Tue Jan 03 12:16:10 2012] [notice] child pid 3538 exit signal > >> > Segmentation fault (11) > >> > > >> > Is this normal? How does one normally run a shell command from a > >> > response handler? I do not want to return the command's output to the > >> > client. > >> > > >> > Here is a trivial example response handler that exhibits this behavior: > >> > > >> > sub handler > >> > { > >> > my $r = shift || die; > >> > my $f = $ENV{DOCUMENT_ROOT} . "/date.txt"; > >> > system("date >> $f"); > >> > $r->internal_redirect("/date.txt"); > >> > return Apache2::Const::OK; > >> > } > >> > > >> > Can anyone provide any guidance? Does this work for you? > >> > > >> > Note that you may not notice the problem if you don't carefully watch > >> > the Apache2 error log (e.g., with "tail -f /var/log/apache2/error.log"), > >> > because Apache2 automatically spawns new children processes as needed, > >> > and client (such as Firefox or wget, though not curl) seem to > >> > automatically re-try the request when it fails, thus giving the illusion > >> > of succeeding. > >> > > >> > P.S. I have posted about this on perlmonks, but thus far have not found > >> > a solution: > >> > http://www.perlmonks.org/?node_id=945947 > >> > > >> > > >> > -- > >> > David Booth, Ph.D. > >> > http://dbooth.org/ > >> > > >> > Opinions expressed herein are those of the author and do not necessarily > >> > reflect those of his employer. > >> > > >> > >> > > > > -- > > David Booth, Ph.D. > > http://dbooth.org/ > > > > Opinions expressed herein are those of the author and do not necessarily > > reflect those of his employer. > > > > -- David Booth, Ph.D. http://dbooth.org/ Opinions expressed herein are those of the author and do not necessarily reflect those of his employer.
