http://www.perlmonks.org?node_id=884384


in reply to Re^6: Stopping an HTTP::Server::Simple server
in thread Stopping an HTTP::Server::Simple server

If your server is non-forking, you should be able just call exit to stop the server. That will do the same thing as the kill line.

If the server is forking under the hood, then in handling a web request you are just killing the child process that is handling that request and another will be spawned shortly. In that case you would need to kill some set of processes to shut it down. What set depends on how it is set up. For instance if it forks for every request received, then killing your parent process (which getppid should give you) will do it. If it preforks and has a pool of processes, then you need to kill them all. Typically you can do that by sending the right signal to the parent process.

Given your described behavior, it sounds like it may be forking. (That, or kill -9 is failing somehow.)

  • Comment on Re^7: Stopping an HTTP::Server::Simple server

Replies are listed 'Best First'.
Re^8: Stopping an HTTP::Server::Simple server
by textual (Novice) on Jan 26, 2011 at 17:28 UTC

    Thanks again for your help, which makes this site the unique resource it is.

    Using exit from within the handler does the job! This seems to be the natural solution I've failed to come up with. So in Webserver.pm:
    package MyWebServer; use strict; use warnings; use HTTP::Server::Simple::CGI; use base qw(HTTP::Server::Simple::CGI); sub handle_request { exit; } 1;

    For the sake of completeness, here's the code where the PID was written in a file (with some diagnostics sent to STDERR). Note that it didn't stop the server:

    In test.pl:
    use strict; use warnings; use MyWebServer; my $server = MyWebServer->new( 8080 ); my $pid = $server->background(); print STDERR $pid, "\n"; open( my $fh, '>', 'pid.txt' ) || die; print $fh $pid; close $fh;
    And in Webserver.pm:
    package MyWebServer; use strict; use warnings; use HTTP::Server::Simple::CGI; use base qw(HTTP::Server::Simple::CGI); sub handle_request { open( my $fh, '<', 'pid.txt' ) || die; my $pid = <$fh>; close $fh; print STDERR $pid, "\n"; kill 9, $pid; } 1;