<html>
<head>
<meta content="text/html; charset=ISO-8859-1"
http-equiv="Content-Type">
</head>
<body bgcolor="#FFFFFF" text="#000000">
On 07/19/2011 05:59 PM, Fulko Hew wrote:
<blockquote
cite="mid:CAGuV3hPP-iyCqG0O6R-+6QnTr8ezp372gRPGTheFa490euNO_A@mail.gmail.com"
type="cite"><font face="courier new,monospace"><br>
</font><br>
<div class="gmail_quote">On Tue, Jul 19, 2011 at 1:48 PM, Jeff
Spaleta <span dir="ltr"><<a moz-do-not-send="true"
href="mailto:jspaleta@gmail.com">jspaleta@gmail.com</a>></span>
wrote:<br>
<blockquote class="gmail_quote" style="margin:0 0 0
.8ex;border-left:1px #ccc solid;padding-left:1ex;">
<div class="im">On Tue, Jul 19, 2011 at 8:51 AM, seth vidal
<<a moz-do-not-send="true"
href="mailto:skvidal@fedoraproject.org">skvidal@fedoraproject.org</a>>
wrote:<br>
> I agree with one section of your argument:<br>
> arguments which are just "I'm not used to this" are
bad arguments.<br>
><br>
> Many of the arguments presented in this and other
threads do not boil<br>
> down to that. If you believe them to do so, Jeff, then
you're presenting<br>
> a straw man as I'm sure you're aware.<br>
<br>
</div>
I disagree this thread specifically boils down to familiarity<br>
argument. Shall I break down the original post point by
point?</blockquote>
<div> <br>
... snip ...<br>
</div>
<div> </div>
<blockquote class="gmail_quote" style="margin: 0pt 0pt 0pt
0.8ex; border-left: 1px solid rgb(204, 204, 204);
padding-left: 1ex;">
- transparency of code due to shell use<br>
<br>
how is shell more transparent? from my meager understanding
of<br>
systemd we are actually getting better more systematic failure
and<br>
logging information from systemd unit files than we get from
the<br>
complexity of shell scripts. Are we not?<br>
</blockquote>
</div>
<br>
Up until now, my package is architecture independent.<br>
<br>
From what I understand, I will now have to provide some systemd<br>
application that is coded in C?<br>
If that is the case, I now have to create an RPM per-architecture<br>
and loose my architecture independence.<br>
<br>
True or false?<br>
<br>
</blockquote>
<br>
False<br>
<br>
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...<br>
<br>
First the converted unit file <br>
<br>
# cat /lib/systemd/system/tomcat6.service <br>
[Unit]<br>
Description=Apache Tomcat Web Applications Server<br>
After=systlog.target network.target<br>
<br>
[Service]<br>
Type=forking<br>
EnvironmentFile=-/etc/sysconfig/tomcat6<br>
ExecStart=/usr/sbin/tomcat6 start<br>
ExecStop=/usr/sbin/tomcat6 stop<br>
<br>
[Install]<br>
WantedBy=multi-user.target<br>
<br>
<br>
Now the legacy sysv init script that everybody seem to love and
cheerish so much... <br>
<br>
# cat /etc/rc.d/init.d/tomcat6 <br>
#!/bin/bash<br>
#<br>
# tomcat6 This shell script takes care of starting and stopping
Tomcat<br>
#<br>
# chkconfig: - 80 20<br>
#<br>
### BEGIN INIT INFO<br>
# Provides: tomcat6<br>
# Required-Start: $network $syslog<br>
# Required-Stop: $network $syslog<br>
# Default-Start:<br>
# Default-Stop:<br>
# Description: Release implementation for Servlet 2.5 and JSP 2.1<br>
# Short-Description: start and stop tomcat<br>
### END INIT INFO<br>
#<br>
# - originally written by Henri Gomez, Keith Irwin, and Nicolas
Mailhot<br>
# - heavily rewritten by Deepak Bhole and Jason Corley<br>
#<br>
<br>
## Source function library.<br>
#. /etc/rc.d/init.d/functions<br>
# Source LSB function library.<br>
if [ -r /lib/lsb/init-functions ]; then<br>
. /lib/lsb/init-functions<br>
else<br>
exit 1<br>
fi<br>
<br>
DISTRIB_ID=`lsb_release -i -s 2>/dev/null`<br>
<br>
NAME="$(basename $0)"<br>
unset ISBOOT<br>
if [ "${NAME:0:1}" = "S" -o "${NAME:0:1}" = "K" ]; then<br>
NAME="${NAME:3}"<br>
ISBOOT="1"<br>
fi<br>
<br>
# For SELinux we need to use 'runuser' not 'su'<br>
if [ -x "/sbin/runuser" ]; then<br>
SU="/sbin/runuser -s /bin/sh"<br>
else<br>
SU="/bin/su -s /bin/sh"<br>
fi<br>
<br>
# Get the tomcat config (use this for environment specific settings)<br>
TOMCAT_CFG="/etc/tomcat6/tomcat6.conf"<br>
if [ -r "$TOMCAT_CFG" ]; then<br>
. $TOMCAT_CFG<br>
fi<br>
# Get instance specific config file<br>
if [ -r "/etc/sysconfig/${NAME}" ]; then<br>
. /etc/sysconfig/${NAME}<br>
fi<br>
<br>
<br>
# Define which connector port to use<br>
CONNECTOR_PORT="${CONNECTOR_PORT:-8080}"<br>
<br>
# Path to the tomcat launch script<br>
TOMCAT_SCRIPT="/usr/sbin/tomcat6"<br>
<br>
# Tomcat program name<br>
TOMCAT_PROG="${NAME}"<br>
<br>
# Define the tomcat username<br>
TOMCAT_USER="${TOMCAT_USER:-tomcat}"<br>
<br>
# Define the tomcat log file<br>
TOMCAT_LOG="${TOMCAT_LOG:-${CATALINA_HOME}/logs/catalina.out}"<br>
<br>
RETVAL="0"<br>
<br>
# Look for open ports, as the function name might imply<br>
function findFreePorts() {<br>
local isSet1="false"<br>
local isSet2="false"<br>
local isSet3="false"<br>
local lower="8000"<br>
randomPort1="0"<br>
randomPort2="0"<br>
randomPort3="0"<br>
local -a listeners="( $(<br>
netstat -ntl | \<br>
awk '/^tcp/ {gsub("(.)*:", "", $4); print
$4}'<br>
) )"<br>
while [ "$isSet1" = "false" ] || \<br>
[ "$isSet2" = "false" ] || \<br>
[ "$isSet3" = "false" ]; do<br>
let port="${lower}+${RANDOM:0:4}"<br>
if [ -z `expr " ${listeners[*]} " : ".*\( $port \).*"` ];
then<br>
if [ "$isSet1" = "false" ]; then<br>
export randomPort1="$port"<br>
isSet1="true"<br>
elif [ "$isSet2" = "false" ]; then<br>
export randomPort2="$port"<br>
isSet2="true"<br>
elif [ "$isSet3" = "false" ]; then<br>
export randomPort3="$port"<br>
isSet3="true"<br>
fi<br>
fi<br>
done<br>
}<br>
<br>
function makeHomeDir() {<br>
if [ ! -d "$CATALINA_HOME" ]; then<br>
echo "$CATALINA_HOME does not exist, creating"<br>
if [ ! -d "/usr/share/${NAME}" ]; then<br>
mkdir /usr/share/${NAME}<br>
cp -pLR /usr/share/tomcat6/* /usr/share/${NAME}<br>
fi<br>
mkdir -p /var/log/${NAME} \<br>
/var/cache/${NAME} \<br>
/var/tmp/${NAME}<br>
ln -fs /var/cache/${NAME} ${CATALINA_HOME}/work<br>
ln -fs /var/tmp/${NAME} ${CATALINA_HOME}/temp<br>
cp -pLR /usr/share/${NAME}/bin $CATALINA_HOME<br>
cp -pLR /usr/share/${NAME}/conf $CATALINA_HOME<br>
ln -fs /usr/share/java/tomcat6 ${CATALINA_HOME}/lib<br>
ln -fs /usr/share/tomcat6/webapps ${CATALINA_HOME}/webapps<br>
chown ${TOMCAT_USER}:${TOMCAT_USER} /var/log/${NAME}<br>
fi<br>
}<br>
<br>
function parseOptions() {<br>
options=""<br>
options="$options $(<br>
awk '!/^#/ && !/^$/ { ORS=" "; print
"export ", $0, ";" }' \<br>
$TOMCAT_CFG<br>
)"<br>
if [ -r "/etc/sysconfig/${NAME}" ]; then<br>
options="$options $(<br>
awk '!/^#/ && !/^$/ { ORS=" "; <br>
print "export ", $0, ";"
}' \<br>
/etc/sysconfig/${NAME}<br>
)"<br>
fi<br>
TOMCAT_SCRIPT="$options ${TOMCAT_SCRIPT}"<br>
}<br>
<br>
# See how we were called.<br>
function start() {<br>
<br>
echo -n "Starting ${TOMCAT_PROG}: "<br>
if [ "$RETVAL" != "0" ]; then <br>
log_failure_msg<br>
return<br>
fi<br>
if [ -f "/var/lock/subsys/${NAME}" ]; then<br>
if [ -f "/var/run/${NAME}.pid" ]; then<br>
read kpid < /var/run/${NAME}.pid<br>
# if checkpid $kpid 2>&1; then<br>
if [ -d "/proc/${kpid}" ]; then<br>
log_success_msg<br>
if [ "$DISTRIB_ID" = "MandrivaLinux" ]; then<br>
echo<br>
fi<br>
return 0<br>
fi<br>
fi<br>
fi<br>
# fix permissions on the log and pid files<br>
export CATALINA_PID="/var/run/${NAME}.pid"<br>
touch $CATALINA_PID 2>&1 || RETVAL="4"<br>
if [ "$RETVAL" -eq "0" -a "$?" -eq "0" ]; then <br>
chown ${TOMCAT_USER}:${TOMCAT_USER} $CATALINA_PID<br>
fi<br>
[ "$RETVAL" -eq "0" ] && touch $TOMCAT_LOG 2>&1
|| RETVAL="4" <br>
if [ "$RETVAL" -eq "0" -a "$?" -eq "0" ]; then<br>
chown ${TOMCAT_USER}:${TOMCAT_USER} $TOMCAT_LOG<br>
fi<br>
if [ "$CATALINA_HOME" != "/usr/share/tomcat6" -a "$RETVAL" -eq
"0" ]; then<br>
# Create a tomcat directory if it doesn't exist<br>
makeHomeDir<br>
# If CATALINA_HOME doesn't exist modify port number so that<br>
# multiple instances don't interfere with each other<br>
findFreePorts<br>
sed -i -e "s/8005/${randomPort1}/g" -e
"s/8080/${CONNECTOR_PORT}/g" \<br>
-e "s/8009/${randomPort2}/g" -e
"s/8443/${randomPort3}/g" \<br>
${CATALINA_HOME}/conf/server.xml<br>
fi<br>
parseOptions<br>
if [ "$RETVAL" -eq "0" -a "$SECURITY_MANAGER" = "true" ]; then<br>
$SU - $TOMCAT_USER -c "${TOMCAT_SCRIPT} start-security" \<br>
>> ${CATALINA_HOME}/logs/initd.log 2>&1 ||
RETVAL="4"<br>
else<br>
<br>
[ "$RETVAL" -eq "0" ] && $SU - $TOMCAT_USER -c
"${TOMCAT_SCRIPT} start" >> ${CATALINA_HOME}/logs/initd.log
2>&1 || RETVAL="4"<br>
fi<br>
if [ "$RETVAL" -eq "0" ]; then <br>
log_success_msg<br>
touch /var/lock/subsys/${NAME}<br>
else<br>
log_failure_msg "Error code ${RETVAL}"<br>
fi<br>
if [ "$DISTRIB_ID" = "MandrivaLinux" ]; then<br>
echo<br>
fi<br>
}<br>
<br>
function stop() {<br>
echo -n "Stopping ${TOMCAT_PROG}: "<br>
if [ -f "/var/lock/subsys/${NAME}" ]; then<br>
parseOptions<br>
if [ "$RETVAL" -eq "0" ]; then<br>
touch /var/lock/subsys/${NAME} 2>&1 || RETVAL="4"<br>
[ "$RETVAL" -eq "0" ] && $SU - $TOMCAT_USER -c
"${TOMCAT_SCRIPT} stop" >> ${CATALINA_HOME}/logs/initd.log
2>&1 || RETVAL="4"<br>
fi<br>
if [ "$RETVAL" -eq "0" ]; then<br>
count="0"<br>
if [ -f "/var/run/${NAME}.pid" ]; then<br>
read kpid < /var/run/${NAME}.pid<br>
until [ "$(ps --pid $kpid | grep -c $kpid)" -eq "0" ] ||
\<br>
[ "$count" -gt "$SHUTDOWN_WAIT" ]; do<br>
if [ "$SHUTDOWN_VERBOSE" = "true" ]; then<br>
echo "waiting for processes $kpid to exit"<br>
fi<br>
sleep 1<br>
let count="${count}+1"<br>
done<br>
if [ "$count" -gt "$SHUTDOWN_WAIT" ]; then<br>
if [ "$SHUTDOWN_VERBOSE" = "true" ]; then<br>
log_warning_msg "killing processes which did
not stop after ${SHUTDOWN_WAIT} seconds"<br>
fi<br>
kill -9 $kpid<br>
fi<br>
log_success_msg<br>
fi<br>
rm -f /var/lock/subsys/${NAME} /var/run/${NAME}.pid<br>
else<br>
log_failure_msg<br>
RETVAL="4"<br>
fi<br>
else<br>
log_success_msg<br>
RETVAL="0"<br>
fi<br>
if [ "$DISTRIB_ID" = "MandrivaLinux" ]; then<br>
echo<br>
fi<br>
}<br>
<br>
function usage()<br>
{<br>
echo "Usage: $0
{start|stop|restart|condrestart|try-restart|reload|force-reload|status|version}"<br>
RETVAL="2"<br>
}<br>
<br>
# See how we were called.<br>
RETVAL="0"<br>
case "$1" in<br>
start)<br>
start<br>
;;<br>
stop)<br>
stop<br>
;;<br>
restart)<br>
stop<br>
start<br>
;;<br>
condrestart|try-restart)<br>
if [ -f "/var/run/${NAME}.pid" ]; then<br>
stop<br>
start<br>
fi<br>
;;<br>
reload)<br>
RETVAL="3"<br>
;;<br>
force-reload)<br>
if [ -f "/var/run/${NAME}.pid" ]; then<br>
stop<br>
start<br>
fi<br>
;;<br>
status)<br>
if [ -f "/var/run/${NAME}.pid" ]; then<br>
read kpid < /var/run/${NAME}.pid<br>
if [ -d "/proc/${kpid}" ]; then<br>
log_success_msg "${NAME} (pid ${kpid}) is
running..."<br>
RETVAL="0"<br>
else<br>
# The pid file exists but the process is not running<br>
log_warning_msg "PID file exists, but process is not
running"<br>
RETVAL="1"<br>
fi<br>
else<br>
pid="$(/usr/bin/pgrep -d , -u ${TOMCAT_USER} -G
${TOMCAT_USER} java)"<br>
if [ -z "$pid" ]; then<br>
# status ${NAME}<br>
# RETVAL="$?"<br>
log_success_msg "${NAME} is stopped"<br>
RETVAL="3"<br>
else<br>
log_success_msg "${NAME} (pid $pid) is running..."<br>
RETVAL="0"<br>
fi<br>
fi<br>
if [ -f /var/lock/subsys/${NAME} ]; then<br>
pid="$(/usr/bin/pgrep -d , -u ${TOMCAT_USER} -G
${TOMCAT_USER} java)"<br>
# The lockfile exists but the process is not running<br>
if [ -z "$pid" ]; then<br>
log_failure_msg "${NAME} lockfile exists but process
is not running"<br>
RETVAL="2"<br>
fi<br>
fi<br>
;;<br>
version)<br>
${TOMCAT_SCRIPT} version<br>
;;<br>
*)<br>
usage<br>
;;<br>
esac<br>
<br>
exit $RETVAL<br>
<br>
</body>
</html>