#!/usr/bin/env perl # starts the plackup -s Starman/Twiggy/Gazelle/Starlet -a bin/app.psgi process # init.d script needs PERL5LIB env var set so plackup can find Plack::Runner # to start service at boot: sudo update-rc.d rwgps defaults # see below for init.d text # this does not work using socket - if run as user raj, lighttpd (www-data) # cannot access socket as Starman sets it to 755, and if run as www-data, # have permission problems on socket & FastMmap cache file in # /tmp/chi-driver-fastmmap dir # (.)(.) use warnings; use strict; use lib '/home/raj/perl5/lib/perl5'; use Daemon::Control; use Plack::Runner; # only needed if using direct in program sub use Data::Printer; # use FindBin qw($Bin); # load AFTER local::lib Carp or FindBin loads system Carp my $GROUP = $ENV{APP_GROUP} || die 'no APP_GROUP env var set'; # warn $GROUP; my $USER = $ENV{APP_USER} || die 'no APP_USER env var set'; # warn $USER; my $run_dir = '/var/run'; # location of pid file & stderr my $app_home = '/home/raj/apps/SessionTest'; my $plackup = '/home/raj/perl5/bin/plackup'; my $server = '/home/raj/perl5/bin/starman'; my $pid_file = $run_dir . '/sessiontest.pid'; my $workers = 3; my $stdout = $app_home . '/logs/deployment.log'; my $stderr = $stdout; # combined my $socket = '/tmp/sessiontest.sock'; my $port = 5001; my $name = 'SessionTest'; my $app = 'app.psgi'; my @program_args = ( -s => 'Gazelle', # Twiggy/Starman/Starlet -a => "$app_home/bin/$app", # -l => $socket, # problematic - see preable above -p => $port, # doesn't work if socket also enabled -E => 'deployment', # tells dancer app which env & logs to use # '--workers' => $workers, ); my %args = ( name => $name, # lsb_start => '$syslog $remote_fs', # lsb_stop => '$syslog', lsb_sdesc => $name, lsb_desc => $name, path => $0, # this script # program => $plackup, program => \&program, # uses Plack::Runner direct program_args => \@program_args, pid_file => $pid_file, stderr_file => $stderr, stdout_file => $stdout, user => $USER, group => $GROUP, fork => 2, ); # warn Dumper \%args; exit Daemon::Control->new(\%args)->run; # this never runs, but need to set socket to writable by www-data: # chmod 0777, $socket; sub program { # set PERL5LIB otherwise it can't find Plack::Runner (and probably others) $ENV{PERL5LIB} = '/home/raj/perl5/lib/perl5:/home/raj/perl-lib'; my $runner = Plack::Runner->new; $runner->parse_options(@program_args); $runner->run; } =begin # alternative method, uses starman executable diretly: sub program { $ENV{PERL5LIB} = '/home/raj/perl5/lib/perl5:/home/raj/perl-lib'; my @args = ( -a => $app, # -l => '/tmp/sessiontest.sock', -p => $port, '--workers' => $workers, # default is 5 # -E => 'deployment', # automatically set for starman ); exec($server, @args); } =cut __DATA__ #!/bin/sh ### BEGIN INIT INFO # Provides: SessionTest # Required-Start: # Required-Stop: # Default-Start: 2 3 4 5 # Default-Stop: 0 1 6 # Short-Description: SessionTest daemon # Description: Controls the sessiontest daemon script ### END INIT INFO export APP_USER=raj export APP_GROUP=raj # so plackup can find Plack::Runner: export PERL5LIB=/home/raj/perl5/lib/perl5 SCRIPT_DIR=/home/raj/apps/SessionTest/bin SCRIPT=sessiontest.pl if [ -x $SCRIPT_DIR/$SCRIPT ]; then /usr/bin/perl $SCRIPT_DIR/$SCRIPT $@ else echo "Required program $SCRIPT_DIR/$SCRIPT not found!" exit 1; fi