#!/bin/sh
# This is a skeleton of a bash daemon. To use for yourself, just set the # daemonName variable and then enter in the commands to run in the doCommands # function. Modify the variables just below to fit your preference.
daemonName=“DAEMON-NAME”
pidDir=“.” pidFile=“$pidDir/$daemonName.pid” pidFile=“$daemonName.pid”
logDir=“.” # To use a dated log file. # logFile=“$logDir/$daemonName-“`date +”%Y-%m-%d”`“.log” # To use a regular log file. logFile=“$logDir/$daemonName.log”
# Log maxsize in KB logMaxSize=1024 # 1mb
runInterval=60 # In seconds
doCommands() {
# This is where you put all the commands for the daemon. echo "Running commands."
}
################################################################################ # Below is the skeleton functionality of the daemon. ################################################################################
myPid=`echo $$`
setupDaemon() {
# Make sure that the directories work.
if [ ! -d "$pidDir" ]; then
mkdir "$pidDir"
fi
if [ ! -d "$logDir" ]; then
mkdir "$logDir"
fi
if [ ! -f "$logFile" ]; then
touch "$logFile"
else
# Check to see if we need to rotate the logs.
size=$((`ls -l "$logFile" | cut -d " " -f 8`/1024))
if [[ $size -gt $logMaxSize ]]; then
mv $logFile "$logFile.old"
touch "$logFile"
fi
fi
}
startDaemon() {
# Start the daemon. setupDaemon # Make sure the directories are there. if [[ `checkDaemon` = 1 ]]; then echo " * \033[31;5;148mError\033[39m: $daemonName is already running." exit 1 fi echo " * Starting $daemonName with PID: $myPid." echo "$myPid" > "$pidFile" log '*** '`date +"%Y-%m-%d"`": Starting up $daemonName."
# Start the loop. loop
}
stopDaemon() {
# Stop the daemon. if [[ `checkDaemon` -eq 0 ]]; then echo " * \033[31;5;148mError\033[39m: $daemonName is not running." exit 1 fi echo " * Stopping $daemonName" log '*** '`date +"%Y-%m-%d"`": $daemonName stopped."
if [[ ! -z `cat $pidFile` ]]; then kill -9 `cat "$pidFile"` &> /dev/null fi
}
statusDaemon() {
# Query and return whether the daemon is running. if [[ `checkDaemon` -eq 1 ]]; then echo " * $daemonName is running." else echo " * $daemonName isn't running." fi exit 0
}
restartDaemon() {
# Restart the daemon. if [[ `checkDaemon` = 0 ]]; then # Can't restart it if it isn't running. echo "$daemonName isn't running." exit 1 fi stopDaemon startDaemon
}
checkDaemon() {
# Check to see if the daemon is running.
# This is a different function than statusDaemon
# so that we can use it other functions.
if [ -z "$oldPid" ]; then
return 0
elif [[ `ps aux | grep "$oldPid" | grep -v grep` > /dev/null ]]; then
if [ -f "$pidFile" ]; then
if [[ `cat "$pidFile"` = "$oldPid" ]]; then
# Daemon is running.
# echo 1
return 1
else
# Daemon isn't running.
return 0
fi
fi
elif [[ `ps aux | grep "$daemonName" | grep -v grep | grep -v "$myPid" | grep -v "0:00.00"` > /dev/null ]]; then
# Daemon is running but without the correct PID. Restart it.
log '*** '`date +"%Y-%m-%d"`": $daemonName running with invalid PID; restarting."
restartDaemon
return 1
else
# Daemon not running.
return 0
fi
return 1
}
loop() {
# This is the loop. now=`date +%s`
if [ -z $last ]; then last=`date +%s` fi
# Do everything you need the daemon to do. doCommands
# Check to see how long we actually need to sleep for. If we want this to run # once a minute and it's taken more than a minute, then we should just run it # anyway. last=`date +%s`
# Set the sleep interval if [[ ! $((now-last+runInterval+1)) -lt $((runInterval)) ]]; then sleep $((now-last+runInterval)) fi
# Startover loop
}
log() {
# Generic log function. echo "$1" >> "$logFile"
}
################################################################################ # Parse the command. ################################################################################
if [ -f “$pidFile” ]; then
oldPid=`cat "$pidFile"`
fi checkDaemon case “$1” in
start)
startDaemon
;;
stop)
stopDaemon
;;
status)
statusDaemon
;;
restart)
restartDaemon
;;
*)
echo "\033[31;5;148mError\033[39m: usage $0 { start | stop | restart | status }"
exit 1
esac
exit 0