BASH脚本启动一个node.js套接字服务器作为服务

基本上我想完成的是一些脚本或方法,以启动一个node.js套接字服务器脚本作为服务。

这是为了让我不必在SSH上运行'node server.js',而必须在打开时坐在那里。

任何帮助,将不胜感激。

感谢Scott

除了forever我没有看到任何罪恶的想要使用不同的东西。 在我的项目中,我也避免使用这种工具,更多地依赖系统function。 由于我也试图避免以root身份运行我的应用程序,因此我无法使用SystemV或Upstart。

这里来了强大的shell scripting ! 我创build了几个简单的任务的bash脚本,比如具有启动,停止,重新启动和查询状态能力的process watchdog

检查这个代码。 随意修改它,你会。 要使用它 – 把你的命令在COMMAND参数。 并执行./path_to_script.sh -start 。 这将创build看门狗进程,这将启动您的节点进程,并观察它是否死亡,如果是,它会重新启动它。 这是远远不理想的,所以如果有人有东西要修复,添加,删除在这里,请随时评论下面。

 #!/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 

这听起来像你想要一个forever的工具。 这里有一个开始的博客post。

还有更多的通用工具,如monit和新贵 。

我个人使用forever在我的项目,它工作得很好。

这很快就变得复杂了。 你真正要求的是如何“守护”一个过程。 这不仅仅是在后台运行它。 理想情况下,您希望以这种方式运行它,使其不会绑定可移动文件系统,并且希望保持其日志输出,而不是将其吐出到旧的terminal。 你不希望当你的shell退出等时意外死亡

如果您使用的是像Debian这样基于Debian的系统,那么/sbin/start-stop-daemon完成您想要的function。 写一个Ubuntu的Upstartconfiguration为它被提及,这也是一个选项。 在Fedora等其他发行版中,systemd提供了通常被认为是这个自动守护程序服务的“镀金”版本。 它可以守护和pipe理基本上没有明确交互的程序。