diff --git a/debian/patches/00list b/debian/patches/00list new file mode 100644 index 0000000..4b77285 --- /dev/null +++ b/debian/patches/00list @@ -0,0 +1 @@ +01_add_pidfile_support.dpatch diff --git a/debian/patches/01_add_pidfile_support.dpatch b/debian/patches/01_add_pidfile_support.dpatch new file mode 100644 index 0000000..7167245 --- /dev/null +++ b/debian/patches/01_add_pidfile_support.dpatch @@ -0,0 +1,108 @@ +#!/bin/sh /usr/share/dpatch/dpatch-run +## 01_add_pidfile_support.dpatch by Jan Wagner +## with hints by Sebastian Harl and +## Alexander Wirt +## +## DP: add pidfile support to ps-watcher + + +--- ps-watcher-1.06/ps-watcher.in.in 2007-07-04 21:34:23.000000000 +0200 ++++ ps-watcher-1.06/ps-watcher.in.in 2008-04-02 18:16:45.000000000 +0200 +@@ -23,8 +23,11 @@ + + use vars qw($program $ps_cmd $ps_cmdfull $ps_fullcmd_fmt @ps_vars $ps_dvars + $0 $logopened $ps_args_fmt $args +- $count $pid $command $ps_arg_opts $DEVNULL %opts ++ $count $pid $command $ps_arg_opts $DEVNULL %opts $PIDFILE + ); ++ ++$PIDFILE = "/var/run/ps-watcher.pid"; ++ + use strict; + BEGIN { require 5.00503 } + +@@ -130,6 +133,7 @@ + sub read_config($); + sub check_config_file($); + sub run_trigger($$$); ++sub check_pid(); + + init(); + process_options(); +@@ -147,7 +151,12 @@ + } + + if ($opts{daemon}) { +- daemonize(); ++ if (! check_pid()) { ++ exit 1; ++ } ++ if (! daemonize()) { ++ exit 1; ++ } + } + + install_handlers(); +@@ -584,14 +593,62 @@ + exit 10; + } + ++sub check_pid() { ++ if (-f $PIDFILE) { ++ if (open(PID,$PIDFILE)) { ++ my $pid = ; ++ if (!close(PID)) { ++ logger("Unable to close file handle PID for file '$PIDFILE': $!"); ++ return; ++ } ++ if (-f "/proc/$pid/stat") { ++ if (open(FH,"/proc/$pid/stat")) { ++ my $line = ; ++ if (!close(FH)) { ++ logger("Unable to close file handle FH for file '/proc/$pid/stat': $!"); ++ return; ++ } ++ if ($line =~ /\d+[^(]*\((.*)\)\s*/) { ++ my $process = $1; ++ if ($process =~ /^$program$/) { ++ logger("$program already running at PID $pid; exiting."); ++ exit(0); ++ } ++ } ++ } else { ++ logger("Unable to open file handle FH for file '/proc/$pid/stat': $!"); ++ return; ++ } ++ } else { ++ logger("Removing stale PID file."); ++ unlink($PIDFILE); ++ } ++ }else{ ++ logger("Unable to open file handle PID for file '$PIDFILE': $!"); ++ return; ++ } ++ } ++ return 1; ++} + + sub daemonize() { + chdir '/' or die "Can't chdir to /: $!"; + defined(my $pid = fork) or die "Can't fork: $!"; + exit 0 if $pid; ++ if (open(FH,">$PIDFILE")) { ++ print FH $$; ++ if (!close(FH)) { ++ logger("Unable to close file handle FH for file '$PIDFILE': $!"); ++ return; ++ } ++ } else { ++ logger("Unable to open file handle FH for file '$PIDFILE': $!"); ++ return; ++ } + use POSIX qw(setsid); + setsid() or die "Can't start a new session: $!"; + umask 0; ++ return 1; + } + + # Time configuration file was last read.