Hi everybody,
yesterday, when writing the core of another daemon intended to run
on one of the servers I administer, I caught myself copy-pasting
code from other daemons. Not some lines but more or less the whole
main part.
After a bit of thinking, I realized that there must be a better
solution. Probably hidden somewhere in CPAN. However, even after
searching quite a long time; I haven't found one.
None - or should I rather say that I found a whole bunch of them?
There are modules (App::Control, Proc::PID::File, File::PID etc.),
all of them doing just one thing, exactly in the standard Unix
manner.
But at least as far as I can see, in this specific case, it leads
into having quite some code a in every daemon which is more or
less redundant.
Thus my question: what about having a solution like this - or does
it exist (and I was just too blind to see it; in that case: sorry
for bothering you)?
A class combines the pid file, daemonize code etc in it (or glues
it together from some modules), so that I can use something like
the following when writing a daemon - I'll name it Proc::Daemonizer
in the examples.
Proc::Daemonzier would take care of
- creating a pid file
- checking if the daemon is really running if the pid file exists
(detection of stale pid files)
- starting only if no instance is running
- restart the daemon|signal him to reconfigure itself
(see example)
Here is how I think an application could use the interface:
package MyDaemon;
use base qw (Proc::Daemonizer);
# (or whatever an appropriate name would be)
sub start {
my $type = shift;
$type->SUPER::start(@_);
# do my own things
};
sub reconfigure {
my $self = shift;
$self->log("WARNING: reconfigure not implemented");
};
...
package main;
MyDaemon -> start('only_if_not_running')
if ($#ARGV = 0 && $ARGV[0] eq '--daemon');
# start the daemon
MyDaemon -> kill() if ($#ARGV = 0 && $ARGV[0] eq '--quit');
# stop the daemon
MyDaemon -> restart() if ($#ARGV = 0 && $ARGV[0] eq '--restart');
# restart the daemon
MyDaemon -> restart() if ($#ARGV = 0 && $ARGV[0] eq '--restart');
# restart the daemon
if ($#ARGV = 0 && $ARGV[0] eq '--status') {
if (MyDaemon -> running ()) {
print "daemon running as pid ".MyDaemon->running()."\n";
} else {
print "daemon not running\n";
}
}