When playsmsd, or any other daemon named as *smsd* is running, sms3 script does not start smsd because grep from process list says that smsd is already running. Also, when sms3 tries to stop smsd, smsd is stopped, but other processes like playsmsd are still found, and sms3 will kill them after maximum time to wait is expired.

The error is caused by pgrep style action: "if ps -e | grep smsd ..." and fixed with "if ps -e | grep "[[:space:]]smsd\$" ...".

Here is the new script:

#! /bin/sh
# This script can be used to start/stop smsd
# as a daemon in Linux, Solaris, Cygwin, FreeBSD
# and MAC OS X Terminal window (Darwin).
# This script is to be used with smsd version >= 3.0.3.
# Last updated: 2011-05-12

# chkconfig: 2345 20 80
# description: Sms server daemon

### BEGIN INIT INFO
# Provides:          smstools
# Required-Start:    $syslog
# Required-Stop:
# Default-Start:     2 3 4 5
# Default-Stop:      0 1 6
# Short-Description: starts smstools
### END INIT INFO

# Set USER and GROUP, if necessary:
USER=""
GROUP=""

# If an unpriviledged user is selected, make sure that next two
# files are writable by that user:
PIDFILE="/var/run/smsd.pid"
INFOFILE="/var/run/smsd.working"
# Logfile can also be defined in here:
LOGFILE="/var/log/smsd.log"

# Set CONFFILE, if necessary:
CONFFILE=""

DAEMON=/usr/local/bin/smsd
# A program which turns power off for couple of seconds:
RESETMODEMS=/usr/local/bin/smsd_resetmodems
NAME=smsd
PSOPT="-e"
ECHO=echo
case `uname` in
  *BSD|Darwin)
    PSOPT="axc"
    ;;
  SunOS)
    ECHO=/usr/ucb/echo
    ;;
esac

# Maximum time to stop smsd, after that it gets killed hardly:
MAXWAIT=45

case "$1" in
  start)
        test -x $DAEMON || exit 0
        $ECHO -n "Starting SMS Daemon: "
        MSG="."
        ARGS="-n MAINPROCESS -p$PIDFILE -i$INFOFILE"
        [ "x$USER" != x ] && ARGS="$ARGS -u$USER"
        [ "x$GROUP" != x ] && ARGS="$ARGS -g$GROUP"
        [ "x$LOGFILE" != x ] && ARGS="$ARGS -l$LOGFILE"
        [ "x$CONFFILE" != x ] && ARGS="$ARGS -c$CONFFILE"
        PID=`cat $PIDFILE 2>/dev/null`
        if [ "x$PID" != x ]; then
          if kill -0 $PID 2>/dev/null; then
            MSG=" already running ($PID)."
          else
            PID=""
          fi
        fi
        if [ "x$PID" = x ]; then
          if ps $PSOPT | grep "[[:space:]]$NAME\$" >/dev/null; then
            MSG=" already running."
          else
            $DAEMON $ARGS
            sleep 1
            PIDS=`ps $PSOPT | grep "[[:space:]]$NAME\$"`
            [ "x$PIDS" = x ] && MSG=" failed."
          fi
        fi
        echo "$NAME$MSG"
        ;;

  stop)
        if ps $PSOPT | grep "[[:space:]]$NAME\$" >/dev/null; then
          PID=`cat $PIDFILE 2>/dev/null`
          if [ "x$PID" != x ]; then
            P=`kill -0 $PID 2>/dev/null`
            [ "x$P" != x ] && PID=""
          fi
          if [ "x$PID" != x ]; then
            kill $PID
          else
            kill `ps $PSOPT | grep "[[:space:]]$NAME\$" | awk '{print $1}'` >/dev/null 2>&1
          fi
          sleep 1
          if ps $PSOPT | grep "[[:space:]]$NAME\$" >/dev/null; then
            echo "Allowing $NAME to terminate gracefully within $MAXWAIT seconds"
            infofound=0
            dots=0
            seconds=0
            while ps $PSOPT | grep "[[:space:]]$NAME\$" >/dev/null; do
              if [ $infofound -lt 1 ]; then
                if [ -f $INFOFILE ]; then
                  infofound=1
                  if [ $dots -gt 0 ]; then
                    echo ""
                    dots=0
                  fi
                  $ECHO -n "$NAME is currently "
                  cat $INFOFILE
                  echo "Time counting is now disabled and we will wait until this job is complete."
                  echo "If you are very hasty, use \"$0 force-stop\" to kill $NAME hardly (not recommended)."
                fi
              fi
              [ $infofound -lt 1 ] && seconds=`expr $seconds + 1`
              $ECHO -n "."
              dots=`expr $dots + 1`
              if [ "$seconds" -ge $MAXWAIT ]; then
                if [ $dots -gt 0 ]; then
                  echo ""
                  dots=0
                fi
                echo "Timeout occured, killing $NAME hardly."
                kill -9 `ps $PSOPT | grep "[[:space:]]$NAME\$" | awk '{print $1}'` >/dev/null 2>&1
                [ -f $PIDFILE ] && rm $PIDFILE
                seconds=0
              fi
              sleep 1
            done
            [ $dots -gt 0 ] && echo ""
            #echo "$NAME is stopped."
          fi
        fi
        ;;

  restart|reload)
        $0 stop
        $0 start
        ;;

  force-stop)
        if ps $PSOPT | grep "[[:space:]]$NAME\$" >/dev/null; then
          echo "Killing $NAME."
          kill -9 `ps $PSOPT | grep "[[:space:]]$NAME\$" | awk '{print $1}'` >/dev/null 2>&1
        fi
        [ -f $PIDFILE ] && rm $PIDFILE
        ;;

  reset)
        $0 stop
        [ -f "$RESETMODEMS" ] && "$RESETMODEMS"
        sleep 30
        $0 start
        ;;

  *)
        echo "Usage: $0 {start|stop|restart|force-stop|reset}"
        exit 1
esac
 
 
'bash' Syntax Highlight powered by GeSHi



« Last edit by keke on Tue Jun 28, 2011 18:20, 155 months ago. »