4

基本的に私が達成したいのは、node.jsソケットサーバースクリプトをサービスとして開始するためのある種のスクリプトまたはメソッドです。

これは、SSHで「nodeserver.js」を物理的に実行し、開いたままそこに座る必要がないようにするためです。

どんな助けでもいただければ幸いです。

ありがとうスコット

4

3 に答える 3

4

以外の何かを使いたいという犯罪者は見当たりません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
于 2012-12-03T09:42:35.907 に答える
1

のようなツールが必要なようですforever。はじめにのブログ投稿がここにあります

monitupstartなどのより一般的なツールもあります。

私はforever自分のサイドプロジェクトで個人的に使用していますが、うまく機能しています。

于 2012-08-21T18:12:53.180 に答える
1

これはすぐに複雑になります。あなたが本当に求めているのは、プロセスを「デーモン化」する方法です。単にバックグラウンドで実行するだけではありません。理想的には、リムーバブルファイルシステムを拘束しないように実行し、ログ出力を保持し、古い端末に吐き出さないようにする必要があります。シェルが終了するときなどに誤って殺されたくない...

UbuntuのようなDebianベースのシステムを使用している場合は、/sbin/start-stop-daemon必要なことの多くを実行します。そのためのUbuntuUpstart構成を作成することが言及されましたが、それもオプションです。Fedoraのような他のディストリビューションでは、systemdは、この自動デーモン化サービスの「金メッキ」バージョンと一般に見なされているものを提供します。基本的に、明示的に対話型ではないすべてのプログラムをデーモン化して管理できます。

于 2012-08-21T19:31:25.520 に答える