簡體   English   中英

BASH腳本,將node.js套接字服務器作為服務啟動

[英]BASH Script to start a node.js socket server as a service

基本上,我想完成的是某種腳本或方法,以供我啟動作為服務的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

聽起來好像您想要一種forever的工具。 有一個入門的博客文章在這里

還有更多通用工具,如monitupstart

我個人forever在我的輔助項目上使用它,並且效果很好。

這變得很快。 您真正要問的是如何“守護”進程。 不僅僅是在后台運行它。 理想情況下,您希望以一種不會捆綁可移動文件系統的方式運行它,並且希望保持其日志輸出並且不讓它隨地吐痰到您的舊終端。 您不希望外殼退出時被意外殺死等等。

如果您使用的是基於Debian的系統(如Ubuntu),則/sbin/start-stop-daemon您的大部分需求。 有人提到為此編寫一個Ubuntu Upstart配置,這也是一個選擇。 在其他發行版(如Fedora)上,systemd提供了通常被視為此自動守護程序服務的“鍍金”版本。 它基本上可以守護和管理任何非顯式交互的程序。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM