diff --git a/cluster/saltbase/salt/kube-addons/initd b/cluster/saltbase/salt/kube-addons/initd index 931877b37b3..c9abf854b2b 100644 --- a/cluster/saltbase/salt/kube-addons/initd +++ b/cluster/saltbase/salt/kube-addons/initd @@ -16,9 +16,9 @@ PATH=/sbin:/usr/sbin:/bin:/usr/bin DESC="Kubernetes Addon Object Manager" NAME=kube-addons -DAEMON_LOG_FILE=/var/log/$NAME.log -PIDFILE=/var/run/$NAME.pid -SCRIPTNAME=/etc/init.d/$NAME +DAEMON_LOG_FILE=/var/log/${NAME}.log +PIDFILE=/var/run/${NAME}.pid +SCRIPTNAME=/etc/init.d/${NAME} KUBE_ADDONS_SH=/etc/kubernetes/kube-addons.sh # Define LSB log_* functions. @@ -34,9 +34,10 @@ KUBE_ADDONS_SH=/etc/kubernetes/kube-addons.sh # do_start() { - ${KUBE_ADDONS_SH} >${DAEMON_LOG_FILE} 2>&1 & - echo $! > ${PIDFILE} - disown + # use setsid to make sure the new daemon has its own group (I suppose + # start-stop-daemon does create a process group, but let's stay on the + # safe side). + setsid start-stop-daemon --start --verbose --background --no-close --make-pidfile --pidfile "${PIDFILE}" --startas "${KUBE_ADDONS_SH}" > ${DAEMON_LOG_FILE} 2>&1 } # @@ -44,14 +45,38 @@ do_start() # do_stop() { - kill $(cat ${PIDFILE}) - rm ${PIDFILE} + # start-stop-daemon is not used because we have to stop all children + # limitations: + # - stop does not work if the pid file is missing + # - stop does not work if the daemon process is missing (children will not + # be killed) + # This is sufficient - remaining processes will end after a while. + + local pid + pid=$(cat "${PIDFILE}" 2> /dev/null) + if [[ $? != 0 ]]; then + return 1 + fi + local pgrp + # find the process group for the service and kill entire group + # o - output format: pgpg - process group + pgrp=$(ps --no-headers --pid "${pid}" -o pgrp 2>/dev/null) + if [[ $? != 0 ]] || [[ "${pgrp}" == "" ]]; then + return 1 + fi + pgrp=$(echo -e ${pgrp}) # strip whitespaces (that's why there are no quotes around pgrp) + # negative pid is for killing entire group + kill -- -${pgrp} 2> /dev/null + if [[ $? != 0 ]]; then + return 2 + fi + rm -f "${PIDFILE}" return } case "$1" in start) - log_daemon_msg "Starting $DESC" "$NAME" + log_daemon_msg "Starting ${DESC}" "${NAME}" do_start case "$?" in 0|1) log_end_msg 0 || exit 0 ;; @@ -59,19 +84,19 @@ case "$1" in esac ;; stop) - log_daemon_msg "Stopping $DESC" "$NAME" + log_daemon_msg "Stopping ${DESC}" "${NAME}" do_stop case "$?" in - 0|1) log_end_msg 0 ;; - 2) exit 1 ;; + 0|1) log_end_msg 0 || exit 0 ;; + 2) log_end_msg 1 || exit 1 ;; esac ;; status) - status_of_proc -p $PIDFILE $KUBE_ADDONS_SH $NAME + status_of_proc -p "${PIDFILE}" "${KUBE_ADDONS_SH}" "${NAME}" ;; restart|force-reload) - log_daemon_msg "Restarting $DESC" "$NAME" + log_daemon_msg "Restarting ${DESC}" "${NAME}" do_stop case "$?" in 0|1) @@ -89,7 +114,7 @@ case "$1" in esac ;; *) - echo "Usage: $SCRIPTNAME {start|stop|status|restart|force-reload}" >&2 + echo "Usage: ${SCRIPTNAME} {start|stop|status|restart|force-reload}" >&2 exit 3 ;; esac diff --git a/cluster/saltbase/salt/kube-addons/kube-addon-update.sh b/cluster/saltbase/salt/kube-addons/kube-addon-update.sh index 083b0ee16bb..dd6ade57c82 100755 --- a/cluster/saltbase/salt/kube-addons/kube-addon-update.sh +++ b/cluster/saltbase/salt/kube-addons/kube-addon-update.sh @@ -162,7 +162,11 @@ function wait-for-jobs() { local rv=0 local pid for pid in $(jobs -p); do - wait ${pid} || (rv=1; log ERR "error in pid ${pid}") + wait ${pid} + if [[ $? -ne 0 ]]; then + rv=1; + log ERR "error in pid ${pid}" + fi log DB2 "pid ${pid} completed, current error code: ${rv}" done return ${rv}