Last active
January 17, 2016 11:50
-
-
Save openhoat/ab259326fefa425f294e to your computer and use it in GitHub Desktop.
CentOS Initd startup script for nodejs app
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/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 $* |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
I'm using it in production for 2 years with nginx as a reverse proxy via unix sockets