基本上我想要完成的是某种脚本或方法让我启动 node.js 套接字服务器脚本,作为服务。
这是为了让我不必在 SSH 中物理运行“node server.js”,也不必在它打开的情况下坐在那里。
任何帮助,将不胜感激。
谢谢斯科特
我认为想要使用不同的东西除了forever
. 在我的项目中,我也避免使用这种工具,更多地依赖系统功能。因为我也尽量避免以 root 身份运行我的应用程序,所以我不能使用 SystemV 或 Upstart。
强大的来了shell scripting
!我创建了一些bash
执行简单任务的脚本,例如process watchdog
具有启动、停止、重新启动和查询状态的能力。
检查此代码。随意修改它。要使用它——把你的命令放在 COMMAND 参数中。并执行./path_to_script.sh -start
. 这将创建看门狗进程,它将启动您的节点进程并观察它是否死亡,如果是,它将重新启动它。这远不是理想的,所以如果有人有什么要修复、添加、删除的,请随时在下面发表评论。
#!/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
这很快就会变得复杂。您真正要求的是如何“守护”进程。它不仅仅是在后台运行它。理想情况下,您希望以不束缚可移动文件系统的方式运行它,并且您希望保留其日志输出并且不让它吐到您的旧终端。你不希望它在你的 shell 退出时被意外杀死,等等......
如果您使用的是 Ubuntu 等基于 Debian 的系统,那么/sbin/start-stop-daemon
它可以满足您的大部分需求。提到了为其编写一个 Ubuntu Upstart 配置,这也是一个选项。在 Fedora 等其他发行版上,systemd 提供了通常被认为是这种自动守护程序服务的“镀金”版本。它基本上可以守护和管理任何非显式交互的程序。