Jo,
> amavisd apparently doesn't
> check to see that it is running -- however, it apparently
> steps on some of its own resources.
At first I didn't have the intention of checking if multiple
instances are running, which may be a regular condition,
but each must have it's own working directory / pid file /
lock file / port. Nevertheless, adding such a check may prevent
simple mistakes, and seeing that Postfix also checks for
already running daemon, here is a patch. It is somewhat
lengthy as it required moving portions of code around.
Please see that it works as one might expect.
Mark
--- amavisd~ Mon Oct 2 02:05:20 2006
+++ amavisd Thu Oct 12 19:20:37 2006
@@ -9766,8 +9766,11 @@
}
}
[EMAIL PROTECTED] <= 1 or die sprintf("Only one command line parameter
allowed: %s\n",
- join(" ",@ARGV));
my($cmd) = lc($ARGV[0]);
-
+if (@ARGV > 1) {
+ die "$myversion: Only one command line parameter allowed: %s\n" .
+ join(" ",@ARGV) . usage();
+} elsif ($cmd !~ /^(?:start|debug|debug-sa|foreground|reload|stop)?\z/) {
+ die "$myversion: Unknown command line parameter: $cmd\n\n" . usage();
+}
if (defined $desired_user && ($> == 0 || $< == 0)) { # drop privileges early
local($1);
@@ -10012,53 +10015,69 @@
}
+# is amavisd daemon already running?
+my($amavisd_pid); # obtain PID of the currently running amavisd daemon
+{ my($pidf) = defined $pid_file_override ? $pid_file_override : $pid_file;
+ $pidf ne '' or die "Config parameter \$pid_file not defined";
+ my($errn) = stat($pidf) ? 0 : 0+$!;
+ if ($errn == ENOENT) {
+ die "The amavisd daemon is not running, no PID file $pidf\n"
+ if $cmd =~ /^(?:reload|stop)\z/;
+ } elsif ($errn != 0) {
+ die "PID file $pidf is inaccessible: $!\n";
+ } else {
+ local($1); my($ln); my($pidf_h) = IO::File->new;
+ $pidf_h->open($pidf,'<') or die "Can't open PID file $pidf: $!";
+ for ($! = 0; defined($ln=$pidf_h->getline); $! = 0) {
+ $amavisd_pid = $1 if $ln =~ /^(\d+)$/ && $1>0 && !defined($amavisd_pid);
+ }
+ defined $ln || $!==0 or die "Error reading from file $pidf: $!";
+ $pidf_h->close or die "Error closing file $pidf: $!";
+ defined($amavisd_pid) or die "Invalid process ID in file $pidf";
+ $amavisd_pid = untaint($amavisd_pid);
+ if (!kill(0,$amavisd_pid)) { undef $amavisd_pid }; # no such process
+ }
+};
# act on command line parameter in $cmd
my($killed_amavisd_pid); my($kill_sig_used);
-if ($cmd =~ /^(start|debug|debug-sa|foreground)?\z/) {
+if ($cmd =~ /^(?:start|debug|debug-sa|foreground)?\z/) {
+ !defined($amavisd_pid)
+ or die "The amavisd daemon is already running: PID [$amavisd_pid]\n";
$DEBUG=1 if $cmd eq 'debug';
$daemonize=0 if $cmd eq 'foreground';
$daemonize=0, $sa_debug=1 if $cmd eq 'debug-sa';
-} elsif ($cmd !~ /^(reload|stop)\z/) {
- die "$myversion: Unknown argument: $cmd\n\n" . usage();
+} elsif ($cmd !~ /^(?:reload|stop)\z/) {
+ die "$myversion: Unknown command line parameter: $cmd\n\n" . usage();
} else { # stop or reload
- eval { # first stop a running daemon
- my($pidf) = defined $pid_file_override ? $pid_file_override : $pid_file;
- $pidf ne '' or die "Config parameter \$pid_file not defined";
- my($errn) = stat($pidf) ? 0 : 0+$!;
- $errn != ENOENT or die "No PID file $pidf\n";
- $errn == 0 or die "PID file $pidf inaccessible: $!";
- my($ln); my($amavisd_pid); my($pidf_h) = IO::File->new;
- $pidf_h->open($pidf,'<') or die "Can't open file $pidf: $!";
- for ($! = 0; defined($ln=$pidf_h->getline); $! = 0) {
- chomp($ln);
- $amavisd_pid = $ln if $ln =~ /^\d+\z/ && !defined($amavisd_pid);
- }
- defined $ln || $!==0 or die "Error reading from $pidf: $!";
- $pidf_h->close or die "Error closing file $pidf: $!";
- defined($amavisd_pid) or die "Invalid PID in the $pidf";
- $amavisd_pid = untaint($amavisd_pid);
- $kill_sig_used = 'TERM';
- kill($kill_sig_used,$amavisd_pid)
- or die "Can't SIGTERM amavisd[$amavisd_pid]: $!";
- my($waited) = 0; my($sigkill_sent) = 0; my($delay) = 1; # seconds
- for (;;) { # wait for the old running daemon to go away
- sleep($delay); $waited += $delay; $delay = 5;
- if (!kill(0,$amavisd_pid)) # is the old daemon still there?
- { $killed_amavisd_pid = $amavisd_pid; last } # old proc is gone, done
- if ($waited < 60 || $sigkill_sent) {
- print STDERR "Waiting for the process [$amavisd_pid] to terminate\n";
- } else { # use stronger hammer
- print STDERR "Sending SIGKILL to amavisd[$amavisd_pid]\n";
- $kill_sig_used = 'KILL';
- kill($kill_sig_used,$amavisd_pid)
- or warn "Can't SIGKILL amavisd[$amavisd_pid]: $!";
- $sigkill_sent = 1;
+ if (!defined($amavisd_pid)) { die "The amavisd daemon is not running\n" }
+ else { # first stop a running daemon
+ eval {
+ $kill_sig_used = 'TERM';
+ kill($kill_sig_used,$amavisd_pid)
+ or die "Can't SIGTERM amavisd[$amavisd_pid]: $!";
+ my($waited) = 0; my($sigkill_sent) = 0; my($delay) = 1; # seconds
+ for (;;) { # wait for the old running daemon to go away
+ sleep($delay); $waited += $delay; $delay = 5;
+ if (!kill(0,$amavisd_pid)) # is the old daemon still there?
+ { $killed_amavisd_pid = $amavisd_pid; last } # old proc is gone, done
+ if ($waited < 60 || $sigkill_sent) {
+ print STDERR "Waiting for the process [$amavisd_pid] to terminate\n";
+ } else { # use stronger hammer
+ print STDERR "Sending SIGKILL to amavisd[$amavisd_pid]\n";
+ $kill_sig_used = 'KILL';
+ kill($kill_sig_used,$amavisd_pid)
+ or warn "Can't SIGKILL amavisd[$amavisd_pid]: $!";
+ $sigkill_sent = 1;
+ }
}
- }
- };
- if ($@ ne '') { chomp($@); die "$@, can't $cmd the process\n" }
- my($msg) = "Daemon [$killed_amavisd_pid] terminated by SIG$kill_sig_used";
- if ($cmd eq 'stop') { print STDERR "$msg\n"; exit 0 }
- print STDERR "$msg, waiting for dust to settle...\n";
- sleep 5; # wait for the TCP socket to be released
+ };
+ if ($@ ne '') { chomp($@); die "$@, can't $cmd the process\n" }
+ }
+ my($msg) = !defined($killed_amavisd_pid) ? undef :
+ "Daemon [$killed_amavisd_pid] terminated by SIG$kill_sig_used";
+ if ($cmd eq 'stop') { print STDERR "$msg\n" if defined $msg; exit(0) }
+ if (defined $killed_amavisd_pid) {
+ print STDERR "$msg, waiting for dust to settle...\n";
+ sleep 5; # wait for the TCP socket to be released
+ }
print STDERR "becoming a new daemon...\n";
}
Mark
-------------------------------------------------------------------------
Using Tomcat but need to do more? Need to support web services, security?
Get stuff done quickly with pre-integrated technology to make your job easier
Download IBM WebSphere Application Server v.1.0.1 based on Apache Geronimo
http://sel.as-us.falkag.net/sel?cmd=lnk&kid=120709&bid=263057&dat=121642
_______________________________________________
AMaViS-user mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/amavis-user
AMaViS-FAQ:http://www.amavis.org/amavis-faq.php3
AMaViS-HowTos:http://www.amavis.org/howto/