Skip to content

Instantly share code, notes, and snippets.

@mylxsw
Last active June 13, 2018 10:32
Show Gist options
  • Save mylxsw/469b5bd96fa8911a4ad7dc4c93f28b2d to your computer and use it in GitHub Desktop.
Save mylxsw/469b5bd96fa8911a4ad7dc4c93f28b2d to your computer and use it in GitHub Desktop.
A very useful unix init.d script template
#!/bin/bash
### BEGIN INIT INFO
# Provides: SERVICE NAME
# Required-Start: $remote_fs
# Should-Start:
# Required-Stop: $remote_fs
# Should-Stop:
# Default-Start: 3 4 5
# Default-Stop: 0 1 2 6
# Short-APP_DESCRIPTION: SERVICE DESCRIPTION
### END INIT INFO
. /lib/lsb/init-functions
# modify start
APP_NAME=SERVICE NAME
APP_DESCRIPTION="SERVICE DESCRIPTION"
APP_CMD="SERVICE START COMMAND"
APP_USER=root
APP_PID_FILE=SERVICE PID FILE
APP_LOG_FILE=SERVICE LOG FILE
# modify end
APP_LOCK_DIR="/var/lock/subsys/"
LOCKFILE="${APP_LOCK_DIR}/${APP_NAME}"
STATUS_RUNNING=0
STATUS_DEAD=1
STATUS_DEAD_AND_LOCK=2
STATUS_NOT_RUNNING=3
ERROR_PROGRAM_NOT_INSTALLED=5
# These directories may be tmpfs and may or may not exist
# depending on the OS (ex: /var/lock/subsys does not exist on debian/ubuntu)
for dir in "$APP_LOCK_DIR"; do
[ -d "${dir}" ] || install -d -m 0755 -o $APP_USER -g $APP_USER ${dir}
done
APP_SHUTDOWN_TIMEOUT=${APP_SHUTDOWN_TIMEOUT:-60}
start() {
[ -x $exec ] || exit $ERROR_PROGRAM_NOT_INSTALLED
checkstatus
status=$?
if [ "$status" -eq "$STATUS_RUNNING" ]; then
exit 0
fi
log_success_msg "Starting ${APP_DESCRIPTION} (${APP_NAME}): "
/bin/su -s /bin/bash -c "/bin/bash -c 'echo \$\$ > ${APP_PID_FILE} && exec ${APP_CMD} >>${APP_LOG_FILE} 2>&1 ' &" $APP_USER
RETVAL=$?
[ $RETVAL -eq 0 ] && touch $LOCKFILE
return $RETVAL
}
stop() {
if [ ! -e $APP_PID_FILE ]; then
log_failure_msg "${APP_NAME} is not running"
exit 0
fi
log_success_msg "Stopping ${APP_DESCRIPTION} (${APP_NAME}): "
APP_PID=`cat $APP_PID_FILE`
if [ -n $APP_PID ]; then
kill -TERM ${APP_PID} &>/dev/null
for i in `seq 1 ${APP_SHUTDOWN_TIMEOUT}` ; do
kill -0 ${APP_PID} &>/dev/null || break
sleep 1
done
kill -KILL ${APP_PID} &>/dev/null
fi
rm -f $LOCKFILE $APP_PID_FILE
return 0
}
restart() {
stop
start
}
checkstatus(){
pidofproc -p $APP_PID_FILE java > /dev/null
status=$?
case "$status" in
$STATUS_RUNNING)
log_success_msg "${APP_NAME} is running"
;;
$STATUS_DEAD)
log_failure_msg "${APP_NAME} is dead and pid file exists"
;;
$STATUS_DEAD_AND_LOCK)
log_failure_msg "${APP_NAME} is dead and lock file exists"
;;
$STATUS_NOT_RUNNING)
log_failure_msg "${APP_NAME} is not running"
;;
*)
log_failure_msg "${APP_NAME} status is unknown"
;;
esac
return $status
}
condrestart(){
[ -e ${LOCKFILE} ] && restart || :
}
case "$1" in
start)
start
;;
stop)
stop
;;
status)
checkstatus
;;
restart)
restart
;;
condrestart|try-restart)
condrestart
;;
*)
echo $"Usage: $0 {start|stop|status|restart|try-restart|condrestart}"
exit 1
esac
exit $RETVAL
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment