File::Pid - Pid File Manipulation


File-Pid documentation Contained in the File-Pid distribution.

Index


Code Index:

NAME

Top

File::Pid - Pid File Manipulation

SYNOPSIS

Top

  use File::Pid;

  my $pidfile = File::Pid->new({
    file => '/some/file.pid',
  });

  $pidfile->write;

  if ( my $num = $pidfile->running ) {
      die "Already running: $num\n";
  }

  $pidfile->remove;

DESCRIPTION

Top

This software manages a pid file for you. It will create a pid file, query the process within to discover if it's still running, and remove the pid file.

new

  my $pidfile = File::Pid->new;

  my $thisfile = File::Pid->new({
    file => '/var/run/daemon.pid',
  });

  my $thisfileandpid = File::Pid->new({
    file => '/var/run/daemon.pid',
    pid  => '145',
  });

This constructor takes two optional paramters.

file - The name of the pid file to work on. If not specified, a pid file located in File::Spec->tmpdir() will be created that matches (File::Basename::basename($0))[0] . '.pid'. So, for example, if $0 is ~/bin/sig.pl, the pid file will be /tmp/sig.pl.pid.

pid - The pid to write to a new pidfile. If not specified, $$ is used when the pid file doesn't exist. When the pid file does exist, the pid inside it is used.

file

  my $pidfile = $pidfile->file;

Accessor/mutator for the filename used as the pid file.

pid

  my $pid = $pidfile->pid;

Accessor/mutator for the pid being saved to the pid file.

write

  my $pid = $pidfile->write;

Writes the pid file to disk, inserting the pid inside the file. On success, the pid written is returned. On failure, undef is returned.

running

  my $pid = $pidfile->running;
  die "Service already running: $pid\n" if $pid;

Checks to see if the pricess identified in the pid file is still running. If the process is still running, the pid is returned. Otherwise undef is returned.

remove

  $pidfile->remove or warn "Couldn't unlink pid file\n";

Removes the pid file from disk. Returns true on success, false on failure.

program_name

This is a utility method that allows you to determine what File::Pid thinks the program name is. Internally this is used when no pid file is specified.

SEE ALSO

Top

perl.

AUTHOR

Top

Casey West, <casey@geeknest.com>.

COPYRIGHT

Top


File-Pid documentation Contained in the File-Pid distribution.
package File::Pid;
# $Id: Pid.pm,v 1.1 2005/01/11 13:09:54 cwest Exp $
use strict;

use vars qw[$VERSION];
$VERSION = sprintf "%d.%02d", split m/\./, (qw$Revision: 1.1 $)[1];

use File::Spec::Functions qw[tmpdir catfile];
use File::Basename qw[basename];
use base qw[Class::Accessor::Fast];

sub new {
    my $class = shift;
    my $self  = $class->SUPER::new(@_);
    $self->_get_pidfile;
    $self->_get_pid;
    return $self;
}
__PACKAGE__->mk_accessors(qw[file pid]);

sub write {
    my $self = shift;
    my $file = $self->_get_pidfile;
    my $pid  = $self->_get_pid;

    local *WRITEPID;
    open WRITEPID, "> $file" or return;
    print WRITEPID "$pid\n";
    close WRITEPID;
    return $pid;
}

sub running {
    my $self = shift;
    my $pid  = $self->_get_pid_from_file;

    return   kill(0, $pid)
           ? $pid
           : undef;
}

sub remove { unlink shift->_get_pidfile }

sub program_name {
    my $self = shift;
    my ($name) = basename($0);
    return $name;
}

sub _get_pidfile {
    my $self = shift;
    return $self->file if $self->file;

    my $file = catfile tmpdir, $self->program_name . '.pid';
    $self->file($file);
    return $self->file;
}

sub _get_pid {
    my $self = shift;
    return $self->pid if $self->pid;
    $self->pid($self->_get_pid_from_file || $$);
    return $self->pid;
}

sub _get_pid_from_file {
    my $self = shift;
    my $file = $self->_get_pidfile;
    local *READPID;
    open READPID, "< $file" or return;
    chomp(my $pid = <READPID>);
    close READPID;
    return $pid;
}

1;

__END__