systemd vice SysV/LSB init systems - what next ?

"Jóhann B. Guðmundsson" johannbg at gmail.com
Tue Jul 19 18:30:59 UTC 2011


On 07/19/2011 05:59 PM, Fulko Hew wrote:
>
>
> On Tue, Jul 19, 2011 at 1:48 PM, Jeff Spaleta <jspaleta at gmail.com 
> <mailto:jspaleta at gmail.com>> wrote:
>
>     On Tue, Jul 19, 2011 at 8:51 AM, seth vidal
>     <skvidal at fedoraproject.org <mailto:skvidal at fedoraproject.org>> wrote:
>     > I agree with one section of your argument:
>     >  arguments which are just "I'm not used to this" are bad arguments.
>     >
>     > Many of the arguments presented in this  and other threads do
>     not boil
>     > down to that. If you believe them to do so, Jeff, then you're
>     presenting
>     > a straw man as I'm sure you're aware.
>
>     I disagree this thread specifically boils down to familiarity
>     argument.  Shall I break down the original post point by point?
>
>
> ... snip ...
>
>      - transparency of code due to shell use
>
>     how is shell more transparent?  from my meager understanding of
>     systemd we are actually getting better more systematic failure and
>     logging information from systemd unit files than we get from the
>     complexity of shell scripts. Are we not?
>
>
> Up until now, my package is architecture independent.
>
> From what I understand, I will now have to provide some systemd
> application that is coded in C?
> If that is the case, I now have to create an RPM per-architecture
> and loose my architecture independence.
>
> True or false?
>

False

Hum best is to provide you with example which daemon do you maintain I 
can convert it for you and provide it to you as an example anyway here's 
an example of a systemd unit that I converted sometime ago for a know 
application named tomcat6 and I'll leave readers to be the judge of that 
what is harder to understand the native systemd unit or the legacy sysv 
init script...

First the converted unit file

# cat /lib/systemd/system/tomcat6.service
[Unit]
Description=Apache Tomcat Web Applications Server
After=systlog.target network.target

[Service]
Type=forking
EnvironmentFile=-/etc/sysconfig/tomcat6
ExecStart=/usr/sbin/tomcat6 start
ExecStop=/usr/sbin/tomcat6 stop

[Install]
WantedBy=multi-user.target


Now the legacy sysv init script that everybody seem to love and cheerish 
so much...

# cat /etc/rc.d/init.d/tomcat6
#!/bin/bash
#
# tomcat6      This shell script takes care of starting and stopping Tomcat
#
# chkconfig: - 80 20
#
### BEGIN INIT INFO
# Provides: tomcat6
# Required-Start: $network $syslog
# Required-Stop: $network $syslog
# Default-Start:
# Default-Stop:
# Description: Release implementation for Servlet 2.5 and JSP 2.1
# Short-Description: start and stop tomcat
### END INIT INFO
#
# - originally written by Henri Gomez, Keith Irwin, and Nicolas Mailhot
# - heavily rewritten by Deepak Bhole and Jason Corley
#

## Source function library.
#. /etc/rc.d/init.d/functions
# Source LSB function library.
if [ -r /lib/lsb/init-functions ]; then
     . /lib/lsb/init-functions
else
     exit 1
fi

DISTRIB_ID=`lsb_release -i -s 2>/dev/null`

NAME="$(basename $0)"
unset ISBOOT
if [ "${NAME:0:1}" = "S" -o "${NAME:0:1}" = "K" ]; then
     NAME="${NAME:3}"
     ISBOOT="1"
fi

# For SELinux we need to use 'runuser' not 'su'
if [ -x "/sbin/runuser" ]; then
     SU="/sbin/runuser -s /bin/sh"
else
     SU="/bin/su -s /bin/sh"
fi

# Get the tomcat config (use this for environment specific settings)
TOMCAT_CFG="/etc/tomcat6/tomcat6.conf"
if [ -r "$TOMCAT_CFG" ]; then
     . $TOMCAT_CFG
fi
# Get instance specific config file
if [ -r "/etc/sysconfig/${NAME}" ]; then
     . /etc/sysconfig/${NAME}
fi


# Define which connector port to use
CONNECTOR_PORT="${CONNECTOR_PORT:-8080}"

# Path to the tomcat launch script
TOMCAT_SCRIPT="/usr/sbin/tomcat6"

# Tomcat program name
TOMCAT_PROG="${NAME}"

# Define the tomcat username
TOMCAT_USER="${TOMCAT_USER:-tomcat}"

# Define the tomcat log file
TOMCAT_LOG="${TOMCAT_LOG:-${CATALINA_HOME}/logs/catalina.out}"

RETVAL="0"

# Look for open ports, as the function name might imply
function findFreePorts() {
     local isSet1="false"
     local isSet2="false"
     local isSet3="false"
     local lower="8000"
     randomPort1="0"
     randomPort2="0"
     randomPort3="0"
     local -a listeners="( $(
                         netstat -ntl | \
                         awk '/^tcp/ {gsub("(.)*:", "", $4); print $4}'
                     ) )"
     while [ "$isSet1" = "false" ] || \
           [ "$isSet2" = "false" ] || \
           [ "$isSet3" = "false" ]; do
         let port="${lower}+${RANDOM:0:4}"
         if [ -z `expr " ${listeners[*]} " : ".*\( $port \).*"` ]; then
             if [ "$isSet1" = "false" ]; then
                 export randomPort1="$port"
                 isSet1="true"
             elif [ "$isSet2" = "false" ]; then
                 export randomPort2="$port"
                 isSet2="true"
             elif [ "$isSet3" = "false" ]; then
                 export randomPort3="$port"
                 isSet3="true"
             fi
         fi
     done
}

function makeHomeDir() {
     if [ ! -d "$CATALINA_HOME" ]; then
         echo "$CATALINA_HOME does not exist, creating"
         if [ ! -d "/usr/share/${NAME}" ]; then
             mkdir /usr/share/${NAME}
             cp -pLR /usr/share/tomcat6/* /usr/share/${NAME}
         fi
         mkdir -p /var/log/${NAME} \
                  /var/cache/${NAME} \
                  /var/tmp/${NAME}
         ln -fs /var/cache/${NAME} ${CATALINA_HOME}/work
         ln -fs /var/tmp/${NAME} ${CATALINA_HOME}/temp
         cp -pLR /usr/share/${NAME}/bin $CATALINA_HOME
         cp -pLR /usr/share/${NAME}/conf $CATALINA_HOME
         ln -fs /usr/share/java/tomcat6 ${CATALINA_HOME}/lib
         ln -fs /usr/share/tomcat6/webapps ${CATALINA_HOME}/webapps
         chown ${TOMCAT_USER}:${TOMCAT_USER} /var/log/${NAME}
     fi
}

function parseOptions() {
     options=""
     options="$options $(
                  awk '!/^#/ && !/^$/ { ORS=" "; print "export ", $0, 
";" }' \
                  $TOMCAT_CFG
              )"
     if [ -r "/etc/sysconfig/${NAME}" ]; then
         options="$options $(
                      awk '!/^#/ && !/^$/ { ORS=" ";
                                            print "export ", $0, ";" }' \
                      /etc/sysconfig/${NAME}
                  )"
     fi
     TOMCAT_SCRIPT="$options ${TOMCAT_SCRIPT}"
}

# See how we were called.
function start() {

    echo -n "Starting ${TOMCAT_PROG}: "
    if [ "$RETVAL" != "0" ]; then
      log_failure_msg
      return
    fi
    if [ -f "/var/lock/subsys/${NAME}" ]; then
         if [ -f "/var/run/${NAME}.pid" ]; then
             read kpid < /var/run/${NAME}.pid
#           if checkpid $kpid 2>&1; then
             if [ -d "/proc/${kpid}" ]; then
                 log_success_msg
                 if [ "$DISTRIB_ID" = "MandrivaLinux" ]; then
                     echo
                 fi
                 return 0
             fi
         fi
     fi
     # fix permissions on the log and pid files
     export CATALINA_PID="/var/run/${NAME}.pid"
     touch $CATALINA_PID 2>&1 || RETVAL="4"
     if [ "$RETVAL" -eq "0" -a "$?" -eq "0" ]; then
       chown ${TOMCAT_USER}:${TOMCAT_USER} $CATALINA_PID
     fi
     [ "$RETVAL" -eq "0" ] && touch $TOMCAT_LOG 2>&1 || RETVAL="4"
     if [ "$RETVAL" -eq "0" -a "$?" -eq "0" ]; then
       chown ${TOMCAT_USER}:${TOMCAT_USER} $TOMCAT_LOG
     fi
     if [ "$CATALINA_HOME" != "/usr/share/tomcat6" -a "$RETVAL" -eq "0" 
]; then
         # Create a tomcat directory if it doesn't exist
         makeHomeDir
         # If CATALINA_HOME doesn't exist modify port number so that
         # multiple instances don't interfere with each other
         findFreePorts
         sed -i -e "s/8005/${randomPort1}/g" -e 
"s/8080/${CONNECTOR_PORT}/g" \
             -e "s/8009/${randomPort2}/g" -e "s/8443/${randomPort3}/g" \
             ${CATALINA_HOME}/conf/server.xml
     fi
     parseOptions
     if [ "$RETVAL" -eq "0" -a "$SECURITY_MANAGER" = "true" ]; then
         $SU - $TOMCAT_USER -c "${TOMCAT_SCRIPT} start-security" \
 >> ${CATALINA_HOME}/logs/initd.log  2>&1 || RETVAL="4"
     else

        [ "$RETVAL" -eq "0" ] && $SU - $TOMCAT_USER -c "${TOMCAT_SCRIPT} 
start" >> ${CATALINA_HOME}/logs/initd.log  2>&1 || RETVAL="4"
     fi
     if [ "$RETVAL" -eq "0" ]; then
         log_success_msg
         touch /var/lock/subsys/${NAME}
     else
         log_failure_msg "Error code ${RETVAL}"
     fi
     if [ "$DISTRIB_ID" = "MandrivaLinux" ]; then
         echo
     fi
}

function stop() {
     echo -n "Stopping ${TOMCAT_PROG}: "
     if [ -f "/var/lock/subsys/${NAME}" ]; then
       parseOptions
       if [ "$RETVAL" -eq "0" ]; then
          touch /var/lock/subsys/${NAME} 2>&1 || RETVAL="4"
          [ "$RETVAL" -eq "0" ] && $SU - $TOMCAT_USER -c 
"${TOMCAT_SCRIPT} stop" >> ${CATALINA_HOME}/logs/initd.log 2>&1 || 
RETVAL="4"
       fi
       if [ "$RETVAL" -eq "0" ]; then
          count="0"
          if [ -f "/var/run/${NAME}.pid" ]; then
             read kpid < /var/run/${NAME}.pid
             until [ "$(ps --pid $kpid | grep -c $kpid)" -eq "0" ] || \
                       [ "$count" -gt "$SHUTDOWN_WAIT" ]; do
                     if [ "$SHUTDOWN_VERBOSE" = "true" ]; then
                         echo "waiting for processes $kpid to exit"
                     fi
                     sleep 1
                     let count="${count}+1"
                 done
                 if [ "$count" -gt "$SHUTDOWN_WAIT" ]; then
                     if [ "$SHUTDOWN_VERBOSE" = "true" ]; then
                         log_warning_msg "killing processes which did 
not stop after ${SHUTDOWN_WAIT} seconds"
                     fi
                     kill -9 $kpid
                 fi
                 log_success_msg
             fi
             rm -f /var/lock/subsys/${NAME} /var/run/${NAME}.pid
         else
             log_failure_msg
             RETVAL="4"
         fi
     else
         log_success_msg
         RETVAL="0"
     fi
     if [ "$DISTRIB_ID" = "MandrivaLinux" ]; then
         echo
     fi
}

function usage()
{
    echo "Usage: $0 
{start|stop|restart|condrestart|try-restart|reload|force-reload|status|version}"
    RETVAL="2"
}

# See how we were called.
RETVAL="0"
case "$1" in
     start)
         start
         ;;
     stop)
         stop
         ;;
     restart)
         stop
         start
         ;;
     condrestart|try-restart)
         if [ -f "/var/run/${NAME}.pid" ]; then
             stop
             start
         fi
         ;;
     reload)
         RETVAL="3"
         ;;
     force-reload)
         if [ -f "/var/run/${NAME}.pid" ]; then
             stop
             start
         fi
         ;;
     status)
         if [ -f "/var/run/${NAME}.pid" ]; then
             read kpid < /var/run/${NAME}.pid
             if [ -d "/proc/${kpid}" ]; then
                 log_success_msg "${NAME} (pid ${kpid}) is running..."
                 RETVAL="0"
             else
# The pid file exists but the process is not running
                log_warning_msg "PID file exists, but process is not 
running"
                RETVAL="1"
             fi
         else
             pid="$(/usr/bin/pgrep -d , -u ${TOMCAT_USER} -G 
${TOMCAT_USER} java)"
             if [ -z "$pid" ]; then
#               status ${NAME}
#               RETVAL="$?"
                 log_success_msg "${NAME} is stopped"
                 RETVAL="3"
             else
                 log_success_msg "${NAME} (pid $pid) is running..."
                 RETVAL="0"
             fi
         fi
          if [ -f /var/lock/subsys/${NAME} ]; then
             pid="$(/usr/bin/pgrep -d , -u ${TOMCAT_USER} -G 
${TOMCAT_USER} java)"
# The lockfile exists but the process is not running
             if [ -z "$pid" ]; then
                log_failure_msg "${NAME} lockfile exists but process is 
not running"
                RETVAL="2"
             fi
          fi
         ;;
     version)
         ${TOMCAT_SCRIPT} version
         ;;
     *)
       usage
       ;;
esac

exit $RETVAL

-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://lists.fedoraproject.org/pipermail/devel/attachments/20110719/9cdcc3f1/attachment.html 


More information about the devel mailing list