多重起動禁止

    # 多重起動停止
    if ($$ != `/usr/bin/pgrep -fo $0`) {
        print STDERR "process running!\n";
        exit 1;
    }
  • node.jsからの起動だと親プロセスのシェルが引っかかるので使えない。。作る。
my ($rc, $fh_lock) = lock_process("/tmp/f");
exit 1 unless $rc;
sleep 60;
close $fh_lock;

sub lock_process
{
    my ($lockfile) = @_;
    my $rc;
    use Symbol;
    my $fh = gensym;
    if (open $fh, $lockfile) {
        my $flock_rc = flock $fh, 6;
        $rc = 1 if $flock_rc == 1;
        print STDERR "lock faild" unless $rc;
    }
    else {
        print STDERR "open lockfile faild $lockfile\n";
    }
    return ($rc, $fh);
}