Skip to content

Instantly share code, notes, and snippets.

@openhoat
Last active January 17, 2016 11:50
Show Gist options
  • Save openhoat/ab259326fefa425f294e to your computer and use it in GitHub Desktop.
Save openhoat/ab259326fefa425f294e to your computer and use it in GitHub Desktop.
CentOS Initd startup script for nodejs app
#!/bin/sh
# -*-Shell-script-*-
#
# chkconfig: 35 99 99
# description: initd startup script for nodejs app <%= name %>
#
. /etc/rc.d/init.d/functions
#
# Config template vars :
#
# - baseDir : root directory of the node app
# - name : the name of the app as in package.json/name
# - main : the main script as in package.json/main
#
NODE_CMD="/usr/local/bin/node"
APP_NAME="<%= name %>"
SERVICE_APP="<%= main %>"
SERVICE_DIR="<%= baseDir %>"
NODE_SOCKET_PATH="/tmp/node.${APP_NAME}.sock"
TMP_PID_FILE="<%= baseDir %>/tmp/<%= name %>.pid"
# NODE_ENV="development"
#
# functions : do not modify after this block
#
do_init() {
PATH=/usr/local/bin:$PATH
NODE_DEFAULT_CMD=$(whereis -b node | cut -d':' -f2 | cut -d' ' -f2)
[ -z ${SERVICE_NAME} ] && SERVICE_NAME="node-${APP_NAME}"
[ -z ${SERVICE_USER} ] && SERVICE_USER="nodejs"
[ -z ${SERVICE_DIR} ] && SERVICE_DIR="/opt/nodejs/${APP_NAME}"
[ -z ${SERVICE_APP} ] && SERVICE_APP="app.js"
[ -z ${SERVICE_LOG} ] && SERVICE_LOG="/var/log/${SERVICE_NAME}.log"
[ -z ${NODE_CMD} ] && NODE_CMD=${NODE_DEFAULT_CMD}
[ -z ${SERVICE_PID_FILE} ] && SERVICE_PID_FILE="/var/run/${SERVICE_NAME}.pid"
[ -z ${SERVICE_LOCK_FILE} ] && SERVICE_LOCK_FILE="/var/lock/subsys/${SERVICE_NAME}"
[ -z ${TMP_PID_FILE} ] && TMP_PID_FILE="/tmp/$$.pid"
[ -z ${NODE_ENV} ] && NODE_ENV="production"
export NODE_ENV
[ -z ${NODE_SOCKET_PATH} ] && NODE_SOCKET_PATH="/tmp/node.${APP_NAME}.sock"
[ -z ${NODE_SOCKET_PATH2} ] && NODE_SOCKET_PATH2=${NODE_SOCKET_PATH}
export NODE_SOCKET_PATH NODE_SOCKET_PATH2
PORT=${NODE_SOCKET_PATH}
export PORT
# [ -f /usr/local/bin/forever ] && FOREVER_CMD="/usr/local/bin/forever"
}
do_log_env() {
echo "APP_NAME=${APP_NAME}"
echo "SERVICE_NAME=${SERVICE_NAME}"
echo "SERVICE_USER=${SERVICE_USER}"
echo "SERVICE_DIR=${SERVICE_DIR}"
echo "SERVICE_APP=${SERVICE_APP}"
echo "SERVICE_NPM_ARGS=${SERVICE_NPM_ARGS}"
echo "SERVICE_LOG=${SERVICE_LOG}"
echo "SERVICE_CMD=${NODE_CMD}"
echo "SERVICE_PID_FILE=${SERVICE_PID_FILE}"
echo "SERVICE_LOCK_FILE=${SERVICE_LOCK_FILE}"
echo "TMP_PID_FILE=${TMP_PID_FILE}"
echo "NODE_ENV=${NODE_ENV}"
echo "NODE_SOCKET_PATH=${NODE_SOCKET_PATH}"
}
do_start() {
if [ "${FOREVER_CMD}" ]; then
cd ${SERVICE_DIR}
${FOREVER_CMD} start --pidFile ${SERVICE_PID_FILE} -l ${SERVICE_LOG} --workingDir ${SERVICE_DIR} -a -d -c "${NODE_CMD}" ${SERVICE_APP} ${SERVICE_ARGS}
RETVAL=$?
else
if [ ! -f "${SERVICE_LOCK_FILE}" ] ; then
touch ${SERVICE_LOG}
chown ${SERVICE_USER} ${SERVICE_LOG}
rm -f ${NODE_SOCKET_PATH} ${NODE_SOCKET_PATH2}
echo -n $"Starting ${SERVICE_NAME}: "
if [ "${SERVICE_NPM_ARGS}" ]; then
runuser "${SERVICE_USER}" -c "cd ${SERVICE_DIR};npm ${SERVICE_NPM_ARGS} >> ${SERVICE_LOG} 2>&1 & echo \$! > ${TMP_PID_FILE}"
else
runuser "${SERVICE_USER}" -c "cd ${SERVICE_DIR};${NODE_CMD} ${SERVICE_APP} >> ${SERVICE_LOG} 2>&1 & echo \$! > ${TMP_PID_FILE}"
fi
RETVAL=$?
if [[ ${RETVAL} -eq 0 ]]; then
sleep 5
if [[ -e ${NODE_SOCKET_PATH} ]]; then
chmod 660 ${NODE_SOCKET_PATH}
fi
if [[ -e ${NODE_SOCKET_PATH2} ]]; then
chmod 660 ${NODE_SOCKET_PATH2}
fi
echo_success
echo
mv ${TMP_PID_FILE} ${SERVICE_PID_FILE}
touch ${SERVICE_LOCK_FILE}
else
echo_failure
echo
fi
else
echo "${SERVICE_NAME} is locked."
RETVAL=1
fi
fi
}
do_stop() {
if [ ${FOREVER_CMD} ]; then
${FOREVER_CMD} stop ${SERVICE_APP}
RETVAL=$?
else
echo -n $"Stopping ${SERVICE_NAME}: "
pid=`cat ${SERVICE_PID_FILE} 2> /dev/null`
kill ${pid} > /dev/null 2>&1
RETVAL=$?
[ ${RETVAL} -eq 0 ] && echo_success || echo_failure
echo
rm -f ${SERVICE_LOCK_FILE} ${SERVICE_PID_FILE} ${NODE_SOCKET_PATH} ${NODE_SOCKET_PATH2}
fi
}
do_restart() {
if [ ${FOREVER_CMD} ]; then
${FOREVER_CMD} restart ${SERVICE_APP}
RETVAL=$?
else
do_stop
do_start
fi
}
do_status() {
echo -n "Service ${SERVICE_NAME} running status : "
pid=`cat ${SERVICE_PID_FILE} 2> /dev/null`
kill -0 ${pid} > /dev/null 2>&1
RETVAL=$?
[ ${RETVAL} -eq 0 ] && echo_success || echo_failure
echo
}
do_main() {
case "$1" in
start)
do_start
;;
stop)
do_stop
;;
restart)
do_restart
;;
status)
do_status
;;
*)
echo "Usage: $0 {start|stop|restart|status}"
RETVAL=1
esac
exit ${RETVAL}
}
do_init
do_main $*
@openhoat
Copy link
Author

I'm using it in production for 2 years with nginx as a reverse proxy via unix sockets

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment