[sf-perl] Running a perl script as a service

Joe Brenner doom at kzsu.stanford.edu
Fri Jan 11 13:03:10 PST 2008


Quinn Weaver <quinn at fairpath.com> wrote:
> Richard Reina wrote:
>
> > Any ideas as to what I'm doing wrong?  Thanks for any help.
>
> I think the problem is this:
>
> When you run it from the command line, it uses your personal
> environment var settings, including your setting for PERL5LIB.
>
> When it runs from your init.d script, it doesn't have your environment--
> just a minimal env setup provided by the init system.
>
> To avoid confusion, I would use an explicit path here:
>
> >       require "mail_processor.pl";
>
> e.g. require '/path/to/mail_processor.pl';

I might try adding a line like:

  use lib '/path/to';

Once you've found one problem like that, it's likely that others will
turn up.  I suggest writing a small script that does things like echo
your environment variables to a log file, then you can run it from
init.d and also from the command-line.  Compare the output of the
two runs, looking for differences that are likely to cause problems
(PERL5LIB, PATH, etc).


Here's a copy of my "echo_env_to_log" if you're interested:

#!/usr/bin/perl
# echo_env_to_log                   doom at kzsu.stanford.edu
#                                   19 Sep 2007

use warnings;
use strict;
$|=1;

use File::Basename qw( basename );

### use Env qw(HOME);

our $VERSION = 0.01;

my $prog = basename($0);

my $label = shift;

my $home = "/home/doom";  # Can't use $HOME: becomes "/root" when you're root.
my $logfile = "$home/tmp/$prog.log";
open my $lf, ">>", $logfile or die "$!";

print {$lf} "\n";

if ($label) {
  print {$lf} "$label:\n";
}

print {$lf} "Running: $0\n";

my $datestamp = `date`;
chomp($datestamp);
print {$lf} "at $datestamp\n";

foreach my $k (keys %ENV) {
   print {$lf} "$k=\"$ENV{$k}\"\n";
}


More information about the SanFrancisco-pm mailing list