Getting a non-zero error code from httpd(1) if the application doesn't compile

Ævar Arnfjörð Bjarmason <[email protected]>
Newsgroups gmane.comp.apache.mod-perl
Message-ID <CACBZZX5ksqM5idiC_9DEw0DLpu8+fWEQk2C+kieWrM0j7OH=hw@mail.gmail.com>
Maybe this is something elementary that I've just missed, but it seems
to me that when transitioning from mod_perl 1 to 2 there's no way to
get a non-zero exit code from Apache if your application has
compilation errors.

I have an application that I'm loading like this:

    PerlPostConfigRequire     /usr/local/myapp/startup.pm

And in that file I do:

    use strict;
    use warnings;

    use Apache2::ServerUtil ();

    BEGIN {
        die "Only makes sense when running under mod_perl\n" if !$ENV{MOD_PERL};

        # We don't want to run this in the first Apache startup phase or
        # we'll start up a useless instance of our application that'll
        # consume memory
        unless (Apache2::ServerUtil::restart_count() > 1) {
            print STDERR "Running in Apache initialization phase #1\n";
            return;
        }

        require lib;
        lib->import('/usr/local/myapp/lib');

        # Preload everything
        require MyApp::Preload;
        require MyApp::Apache::Handler;
    }

    1;

And even though I've inserted a "die" at line two of Handler.pm when
starting I get:

    $ date; time sudo /usr/sbin/httpd; echo $?
    Sat Oct 15 17:50:24 CEST 2011

    real    0m1.113s
    user    0m0.045s
    sys     0m0.035s
    0

At which point httpd returns zero exit code, but then proceeds to
start up my application, only later will I get this in the error log:

    [Sat Oct 15 17:50:31 2011] [error] Died at
/usr/local/myapp/lib/MyApp/Apache/Handler.pm line 2

Of course if I load the application both when restart_count() == 1 and
>1 I'll get an error, but I'll also waste a lot of memory since I'll
be keeping around a copy of the application.

The reason I want to have a non-zero exit code if the application has
an error when initializing is that I have some production systems that
indicate problems if the startup fails, and while we could start up,
wait a bit, and then try if a http requests succeeds I'd rather change
how Apache operates than changing those systems if possible.

As far as I can tell my only options are:

 * To find some Apache config option to make the server wait until
   it's successfully loaded mod_perl in restart_count() > 1. This
   option has thus far evaded be and it might not exist at all.

 * Wrap Apache in an init script that forks, and then either polls
   http:// or does an strace() and waits for sign of successfully
   forked children.

 * Change the startup.pm to have something like:

        unless (Apache2::ServerUtil::restart_count() > 1) {
            print STDERR "Running in Apache initialization phase #1\n";
            system $^X => qw(MyApp::Apache::Handler -e1) and die $!;
            return;
        }

   Which would slow down our startup, but wouldn't take up a
   unnecessary amount of memory by keeping a the restart_count() ==
   1's processes require()'d modules around.
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.