mirror of https://github.com/Cisco-Talos/clamav
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
119 lines
2.4 KiB
119 lines
2.4 KiB
#!/bin/sh
|
|
|
|
# safe_clamd - a script to start clamd and restart if it dies unexpectedly
|
|
# Please report bugs at https://wwws.clamav.net/bugzilla/show_bug.cgi?id=2026
|
|
# Usage:
|
|
# start with ./safe_clamd
|
|
# stop by sending a TERM signal to the safe_clamd process
|
|
|
|
{
|
|
####################### CONFIGURATION #######################
|
|
# path to clamd.conf
|
|
CLAMDCONF='/usr/local/etc/clamd.conf'
|
|
# path to clamd binary
|
|
CLAMDBIN='/usr/local/sbin/clamd'
|
|
# interval between checks
|
|
SLEEPINTERVAL=3
|
|
# after a successful restart, sleep for $THROTTLE secs before attempting to restart clamd again
|
|
THROTTLE=30
|
|
##################### END CONFIGURATION #####################
|
|
|
|
# Do not touch anything below this line, unless you know what you are doing
|
|
trap "signalClamd HUP" SIGHUP
|
|
trap "signalClamd TERM" SIGTERM
|
|
trap "signalClamd USR2" SIGUSR2
|
|
|
|
getPid() {
|
|
PIDFILE=`grep ^PidFile $CLAMDCONF | sed -e 's/^PidFile\s*//'`
|
|
if [ -z "PIDFILE" ]
|
|
then
|
|
# missing PidFile directive
|
|
echo "Please enable the PidFile directive in $CLAMDCONF. See man clamd.conf for more info."
|
|
exit 1
|
|
fi
|
|
CLAMDPID=`cat $PIDFILE 2>/dev/null | grep -Eo '^[0-9]+$'`
|
|
if [ -z "$CLAMDPID" ]
|
|
then
|
|
# empty pidfile
|
|
CLAMDPID=0
|
|
return
|
|
fi
|
|
if ps p $CLAMDPID | grep -v grep | grep $CLAMDBIN > /dev/null
|
|
then
|
|
# good pid
|
|
return
|
|
fi
|
|
# invalid pid
|
|
CLAMDPID=0
|
|
}
|
|
|
|
startClamd() {
|
|
rm -f $PIDFILE
|
|
if test -f $PIDFILE
|
|
then
|
|
echo "ERROR: cannot remove $PIDFILE"
|
|
exit 1
|
|
else
|
|
$CLAMDBIN $args
|
|
if [ $? -ne 0 ]
|
|
then
|
|
exit $?
|
|
fi
|
|
sleep $THROTTLE
|
|
fi
|
|
}
|
|
|
|
signalClamd() {
|
|
getPid
|
|
if [ $CLAMDPID -gt 0 ]; then
|
|
echo "Sending $1 to pid $CLAMDPID..."
|
|
kill -$1 $CLAMDPID
|
|
else
|
|
echo "$CLAMDBIN is not running."
|
|
fi
|
|
if [ "$1" == "TERM" ]; then
|
|
echo Exiting $0 ...
|
|
exit
|
|
fi
|
|
}
|
|
|
|
args=$@
|
|
|
|
# start clamd
|
|
# if it start successfully, enter loop
|
|
# every 5 secs, find pid, verify it belongs to clamd, kill -0
|
|
# restart it if dead
|
|
while [ true ]; do
|
|
if test -r "$CLAMDCONF"
|
|
then
|
|
if test -x "$CLAMDBIN"
|
|
then
|
|
# retrieve pid
|
|
getPid
|
|
# pid found?
|
|
if [ $CLAMDPID -gt 0 ]
|
|
then
|
|
if kill -0 $CLAMDPID > /dev/null 2>/dev/null
|
|
then
|
|
# pid is alive, sleep before next check
|
|
sleep $SLEEPINTERVAL
|
|
else
|
|
# stale pid
|
|
rm -f $PIDFILE
|
|
startClamd
|
|
fi
|
|
else
|
|
# pid does not belong to clamd
|
|
startClamd
|
|
fi
|
|
else
|
|
echo $CLAMDBIN not found
|
|
exit 1
|
|
fi
|
|
else
|
|
echo $CLAMDCONF not found
|
|
exit 1
|
|
fi
|
|
done
|
|
|
|
} &
|
|
|