基本上我想要实现的是一种脚本或方法,让我能够将一个 node.js socket 服务器脚本作为服务启动。
这样就不用在 SSH 中手动运行 'node server.js' 并保持其打开状态。
任何帮助都将不胜感激。
谢谢,Scott。
这样就不用在 SSH 中手动运行 'node server.js' 并保持其打开状态。
任何帮助都将不胜感激。
谢谢,Scott。
forever
以外的其他工具并没有任何不妥之处。在我的项目中,我也避免使用这种类型的工具,更多地依赖于系统能力。由于我也试图避免将我的应用程序作为 root 运行,因此我无法使用 SystemV 或 Upstart。
这时强大的 shell 脚本
登场了!我创建了一些简单任务的 bash
脚本,例如带有启动、停止、重启和查询状态功能的 进程看门狗
。
请查看以下代码。随意修改它。要使用它,请将你的命令放在 COMMAND 参数中。然后执行 ./path_to_script.sh -start
。这将创建一个看门狗进程,它将启动你的 node 进程,并监视它是否死亡,如果是,则会重新启动它。这远非完美,因此如果有人想在这里修复、添加或删除内容,请随意在下面评论。
#!/bin/bash
CURRENT_PATH=$(pwd)
LOGFOLDER=$CURRENT_PATH"/logs/"
PIDFOLDER=$CURRENT_PATH"/pid/"
#PID file where the this script process ID is stored
WATCHDOGPIDFILE=$PIDFOLDER"watchdog-admin.pid"
#PID file where the node process ID is stored
NODEPIDFILE=$PIDFOLDER"node-admin.pid"
#Watchdog process error log file
WATCHDOGLOGFILE=$LOGFOLDER"admin-watchdog-error.log"
#Node process error log file
NODELOGFILE=$LOGFOLDER"admin-error.log"
#Command to be executed on daemon start
COMMAND="node ./admin/app.js 1> /dev/null 2>> $NODELOGFILE"
ARG_1=$1
start() {
if [ -e $NODEPIDFILE ]; then
PID=$(cat $NODEPIDFILE)
if [ $(ps -o pid | grep $PID) ]; then
return;
else
touch $NODEPIDFILE
nohup $COMMAND &
echo $! > $NODEPIDFILE
fi
else
touch $NODEPIDFILE
nohup $COMMAND &
echo $! > $NODEPIDFILE
fi
}
stop() {
if [ -e $NODEPIDFILE ]; then
PID=$(cat $NODEPIDFILE)
if [ $(ps -o pid | grep $PID) ]; then
kill -9 $PID
fi
rm $NODEPIDFILE
fi
}
stopdaemon() {
stop
rm $WATCHDOGPIDFILE
exit 0
}
log() {
echo $1 >> $WATCHDOGLOGFILE
}
keep_alive() {
if [ -e $NODEPIDFILE ]; then
PID=$(cat $NODEPIDFILE)
if [ $(ps -o pid | grep $PID) ]; then
return;
else
log "Jim, he is dead!! Trying ressurection spell..."
start
fi
else
start
fi
}
case x${ARG_1} in
x-start )
echo "Starting daemon watchdog"
nohup "$0" -daemon &> /dev/null &
;;
x-daemon )
if [ -e $WATCHDOGPIDFILE ]; then
PID=$(cat $WATCHDOGPIDFILE)
if [ $(ps -o pid | grep $PID) ]; then
exit 0;
fi
fi
touch $WATCHDOGPIDFILE
echo $$ > $WATCHDOGPIDFILE
#trap the interruption or kill signal
trap stopdaemon INT SIGINT TERM SIGTERM
start
while true; do
keep_alive
wait
sleep 1
done
;;
x-stop )
echo "Stopping daemon watchdog"
PID=$(cat $WATCHDOGPIDFILE)
kill $PID
;;
x-status )
#check if process is running and PID file exists, and report it back
;;
x )
echo "Usage {start|stop|status}"
esac
exit 0