#!/usr/bin/perl -w use strict; use Proc::Daemon; use Sys::Syslog; Proc::Daemon::Init; my $PS = '/bin/ps'; my $PROGRAM = 'progwatch'; my $DATAPATH = '/usr/local/sbin/'; my $DATAFILE = 'progwatch.rc'; my $CMD = "$PS xo \%c"; my $SLEEP = 10; my %saw = (); my @progs = (); while(1) { undef %saw; @progs = grep(!$saw{$_}++, `$CMD`); chomp(@progs); open(FH, '<' . $DATAPATH . $DATAFILE) || die("Couldn't open datafile: $!"); foreach () { my ($prog, $cmd) = split /:/; chomp; if (!grep { $prog eq $_ } @progs) { openlog($PROGRAM, 'cons,pid', 'user'); syslog('warning', "Restarting $prog"); closelog(); system($cmd); } } close(FH); sleep($SLEEP); }