User Tools

Site Tools


skeleton-daemon.sh

This is an old revision of the document!


#!/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

skeleton-daemon.sh.1753030124.txt.gz · Last modified: by 114.119.135.136

Donate Powered by PHP Valid HTML5 Valid CSS Driven by DokuWiki