Real Life Example
file: code/validad/single_fork_app
1: #!/usr/bin/env perl
2:
3: use strict;
4: use warnings;
5: use 5.010;
6:
7: use POSIX ":sys_wait_h";
8:
9: use FindBin;
10: use lib $FindBin::Bin . '/../lib';
11: use Winxle::Run;
12:
13: use Path::Class qw(file);
14: use Winxle::BreadBoard;
15: use Getopt::Long;
16:
17: my %babies;
18: my @services = qw(
19: yp_server
20: -
21: l10n_service_backend
22: -
23: mailer
24: renderservice_ventilator
25: web
26: campaignspread
27: admin
28: renderservice_worker
29: renderservice_worker
30: );
31:
32: sub load_and_init_app {
33: my $BB = shift;
34: my $service = shift;
35: $0 = $service;
36:
37: my $app = $BB->resolve( service => 'App/'.$service );
38:
39: $app->run;
40: exit;
41: }
42:
43: sub run_in_parent {
44: foreach my $child_pid (sort keys %babies) {
45: printf("Forked App >%s< with pid %i\n", $babies{$child_pid}, $child_pid );
46: }
47:
48: while (1) {
49: sleep(60);
50: }
51: }
52:
53: my $BB = Winxle::BreadBoard->setup('Dev');
54: foreach my $service_name (@services) {
55: if ( $service_name eq '-' ) {
56: sleep 1;
57: next;
58: }
59: if ( my $pid = fork() ) { # parent
60: $babies{$pid} = $service_name;
61: next;
62: }
63: else { # child
64: $SIG{CHLD} = $SIG{TERM} = $SIG{KILL} = 'DEFAULT';
65: load_and_init_app( $BB, $service_name );
66: }
67: }
68:
69: run_in_parent($BB) if scalar keys %babies;
70:
71: say "Reached the end of the single_for_server, should never happen...";
72: exit;