| #! /bin/sh |
| # Copyright (c) 1995-2001 SuSE GmbH Nuernberg, Germany. |
| # |
| # Author: Hannes Reinecke <feedback@suse.de> |
| # |
| # init.d/multipathd |
| # |
| ### BEGIN INIT INFO |
| # Provides: multipathd |
| # Required-Start: $syslog |
| # Required-Stop: $syslog |
| # Default-Start: 3 5 |
| # Default-Stop: 0 1 2 4 6 |
| # Short-Description: Starts multipath daemon |
| # Description: Starts the multipath daemon |
| ### END INIT INFO |
| |
| PATH=/bin:/usr/bin:/sbin:/usr/sbin |
| DAEMON=/sbin/multipathd |
| PIDFILE=/var/run/multipathd.pid |
| MPATH_INIT_TIMEOUT=10 |
| ARGS="" |
| |
| # Set the maximum number of open files |
| MAX_OPEN_FDS=4096 |
| |
| # Set to enable asynchronous daemon startup |
| DAEMON_ASYNC_STARTUP= |
| |
| test -x $DAEMON || exit 5 |
| |
| . /etc/rc.status |
| |
| # First reset status of this service |
| rc_reset |
| |
| case "$1" in |
| start) |
| echo -n "Starting multipathd" |
| ulimit -c unlimited |
| if $DAEMON -k"reset log" > /dev/null 2>&1 ; then |
| echo -n " (multipathd running)" |
| rc_status -v |
| rc_exit |
| fi |
| |
| modprobe dm-multipath |
| |
| # Set the maximum number of open files |
| if [ -n "$MAX_OPEN_FDS" ] ; then |
| ulimit -n $MAX_OPEN_FDS |
| fi |
| |
| $DAEMON $ARGS |
| |
| if [ -n "$DAEMON_ASYNC_STARTUP" ] ; then |
| rc_status -v |
| rc_exit |
| fi |
| # Wait for the daemon to start up |
| status=$($DAEMON -k'show daemon' 2> /dev/null) |
| timeout=$MPATH_INIT_TIMEOUT |
| while [ $timeout -gt 0 ] ; do |
| if [ -n "$status" ] ; then |
| PID=${status##pid } |
| STATUS=${PID##* } |
| # Configuration might be taking some time, |
| # so don't increase the timeout here |
| [ "$STATUS" != "configure" ] && timeout=$(( $timeout - 1 )) |
| |
| [ "$STATUS" == "running" ] && break |
| else |
| timeout=$(( $timeout - 1 )) |
| fi |
| sleep 1 |
| status=$($DAEMON -k'show daemon' 2> /dev/null) |
| done |
| if [ -z "$status" ] ; then |
| rc_failed 7 |
| fi |
| if [ $timeout -le 0 ] ; then |
| rc_failed 1 |
| fi |
| # Remember status and be verbose |
| rc_status -v |
| ;; |
| stop) |
| echo -n "Shutting down multipathd" |
| STATUS="unknown" |
| # Try to get PID from daemon |
| status=$($DAEMON -k'show daemon' 2> /dev/null) |
| if [ -n "$status" ] ; then |
| PID=${status##pid } |
| STATUS=${PID##* } |
| PID=${PID%% *} |
| fi |
| # Fallback to PID file for older versions |
| if [ -z "$PID" ] || [ "$PID" == "multipath-tools" ] ; then |
| if [ -f $PIDFILE ]; then |
| PID="$(cat $PIDFILE)" |
| STATUS="running" |
| else |
| rc_failed 7 |
| rc_status -v |
| rc_exit |
| fi |
| fi |
| # Shutdown the daemon via CLI |
| if [ "$STATUS" = "running" ] ; then |
| status=$($DAEMON -k'shutdown' 2> /dev/null) |
| if [ "$status" = "ok" ] ; then |
| timeout=$MPATH_INIT_TIMEOUT |
| while [ $timeout -gt 0 ] ; do |
| PROCNAME="$(ps -p $PID -o comm=)" |
| if [ "$PROCNAME" != "multipathd" ] && |
| [ "$PROCNAME" != "multipathd <defunct>" ] ; then |
| STATUS="shutdown" |
| break |
| fi |
| sleep 1 |
| timeout=$(( $timeout - 1 )) |
| done |
| fi |
| fi |
| # Kill the daemon if the above failed |
| if [ -n "$PID" -a "$STATUS" != "shutdown" ] ; then |
| kill -TERM $PID |
| timeout=$MPATH_INIT_TIMEOUT |
| while [ $timeout -gt 0 ] ; do |
| PROCNAME="$(ps -p $PID -o comm=)" |
| if [ "$PROCNAME" != "multipathd" ] && |
| [ "$PROCNAME" != "multipathd <defunct>" ] ; then |
| STATUS="shutdown" |
| break |
| fi |
| sleep 1 |
| timeout=$(( $timeout - 1 )) |
| done |
| fi |
| if [ $STATUS != "shutdown" ] ; then |
| echo -n " (still running)" |
| rc_failed 1 |
| fi |
| |
| # Remember status and be verbose |
| rc_status -v |
| ;; |
| try-restart) |
| ## Stop the service and if this succeeds (i.e. the |
| ## service was running before), start it again. |
| $0 status >/dev/null && $0 restart |
| |
| # Remember status and be quiet |
| rc_status |
| ;; |
| restart|force-reload) |
| ## Stop the service and regardless of whether it was |
| ## running or not, start it again. |
| $0 stop |
| $0 start |
| |
| # Remember status and be quiet |
| rc_status |
| ;; |
| reload) |
| ## Like force-reload, but if daemon does not support |
| ## signalling, do nothing (!) |
| |
| $DAEMON -k"reconfigure" > /dev/null 2>&1 |
| |
| # Remember status and be quiet |
| rc_status |
| ;; |
| status) |
| echo -n "Checking for multipathd: " |
| |
| # Status has a slightly different for the status command: |
| # 0 - service running |
| # 1 - service dead, but /var/run/ pid file exists |
| # 2 - service dead, but /var/lock/ lock file exists |
| # 3 - service not running |
| |
| status=$($DAEMON -k'show daemon' 2> /dev/null) |
| if [ -n "$status" ]; then |
| (exit 0) |
| else |
| (exit 3) |
| fi |
| rc_status -v |
| ;; |
| probe) |
| ## Optional: Probe for the necessity of a reload, |
| ## give out the argument which is required for a reload. |
| ;; |
| *) |
| echo "Usage: $0 {start|stop|status|try-restart|restart|force-reload|reload|probe}" |
| exit 1 |
| ;; |
| esac |
| rc_exit |