システムの再起動時に自動的に永久に開始する(ノード)


190

ノードのforeverモジュールを使用して、ノードサーバーを実行し続けています。ただし、システムを再起動すると、永久に終了します。システムの再起動時にノードサーバーを(永久に)自動的に起動する方法はありますか?


1
このサーバーはクラウドにありますか?起動スクリプトはありますか?
ホルヘアランダ

6
チェックアウトPM2!それもサポートスタートアップスクリプトの生成(systemdに、SystemVの...)pm2.keymetrics.io/docs/usage/startup
ユニテック

回答:


341

crontabの使用をお勧めします。使い方は簡単です。

方法

  1. 編集を開始するには、次のコマンドを実行して、「testuser」をノードプロセスの目的のランタイムユーザーに置き換えます。自分以外のユーザーを選択した場合は、sudoでこれを実行する必要があります。

    $ crontab -u testuser -e
  2. これまでに行ったことがない場合は、どのエディターで編集するかを尋ねられます。私はvimが好きですが、使いやすさからnanoをお勧めします。

  3. エディターに入ったら、次の行を追加します。

    @reboot /usr/local/bin/forever start /your/path/to/your/app.js
  4. ファイルを保存します。cronがインストールされたというフィードバックが得られるはずです。

  5. cronのインストールをさらに確認するには、次のコマンドを実行して(「testuser」をターゲットユーザー名に置き換えて)、現在インストールされているcronを一覧表示します。

    $ crontab -u testuser -l 

私の意見では、cronでバイナリを実行するときは常にフルパスを使用する必要があります。また、foreverスクリプトへのパスが正しくない場合は、実行which foreverして完全なパスを取得します。

そのforever呼び出しを前提としてnode、以下への完全なパスを提供することもできますnode

@reboot /usr/local/bin/forever start -c /usr/local/bin/node /your/path/to/your/app.js

参考文献


2
このアプローチは適切ですが、システムが再起動する場合にのみ有効です。サーバーがシャットダウンしてから電源がオンになった場合-このcronジョブは実行されません。
ecdeveloper 2013年

6
何があなたをそう思わせたのですか? en.wikipedia.org/wiki/Cron#Predefined_scheduling_definitions@reboot cronが開始するcronデーモンで実行されることを説明します。付け加えると、設定されているcron @rebootがシステムブート時に実行されないことを示唆する状況に遭遇したことはありません。シャットダウンする方法はこれには関係ありません。
ジュリアンラニガン2013年

16
表示され/home、これは動作しませんので、あなたのコードはに住んでいる場合は、まだマウントされていません/home
chovy

6
-cオプションを指定しても、cronが永久に実行しようとすると、ノードがパスに含まれないため、上記が失敗することがわかりました。ただし、PATHステートメントがスケジュールステートメントの上にある限り、crontabに直接追加できることがわかります。PATHが設定されると、@ rebootステートメントは夢のように機能しました。
YorkshireKev 2014年

2
コメント@chovyをありがとう、それは非常に役に立ちました。bashrcの環境変数を使用している人は、彼のコメントを気にしてください。/ homeがマウントされていないため、機能しません。次のようにcrontabコマンドで変数を設定します@reboot varname=value ...
lsborg

123

これを行うには、forever-serviceを使用できます。

npm install -g forever-service
forever-service install test

これにより、現在のディレクトリにapp.jsがサービスとして永久にプロビジョニングされます。サービスは、システムが再起動されるたびに自動的に再起動します。また、停止すると、正常な停止が試行されます。このスクリプトは、logrotateスクリプトもプロビジョニングします。

GithubのURL:https : //github.com/zapty/forever-service

注:私はforever-serviceの作成者です。


2
使用-e "PORT = 80 ENV = PROD FOO = bar"のオプション
arva

2
forever-serviceを実行する方法がわかりません。「永久サービスインストールテスト」の「テスト」とは何ですか?アプリを永久に起動するコマンドは次のとおりです: "/ usr / local / bin / forever start -c / usr / local / bin / node / home / alex / public / node_modules / http-server / bin / http-server -s- d false」。私は何を書かなければならないでしょうか?
アレックス

3
ここでのテストは、サービスの名前です。forever-service install testを実行すると、testというサービスが作成され、そのディレクトリでapp.jsを実行してサービスとして実行されます。gihubページのヘルプドキュメントを読み、理解できない場合はそこに問題を追加することをお勧めします。
アルバ

6
@Alex-arvaのコメントを明確にするため-この例forever-service install testtestは、サービスの名前になりますが、実行する実際のプログラム/ノードの.jsファイルの名前ではありません。デフォルトでは、プログラムの名前はであると想定されてapp.jsいますが--script、次のようにフラグで上書きできますforever-service install test --script main.js。(テストされていないため、構文の詳細に誤りがある場合は修正してください。)
Dan Nissenbaum

3
@DanNissenbaum回答ありがとうございます。私は今、美しく機能するPM2を使用しています。注意事項:digitalocean.com/community/tutorials/...
アレックス

26

このケースはDebianに有効です。

以下を追加 /etc/rc.local

/usr/bin/sudo -u {{user}} /usr/local/bin/forever start {{app path}}

  • {{user}} ユーザー名を置き換えます。
  • {{app path}}アプリのパスを置き換えます。例えば、/var/www/test/app.js

2
多くの人にとってこれはおそらく問題ではありませんが、この方法は適切なシャットダウンを扱いません。
UpTheCreek 2013年

6
ところで-私はあなたが編集すべきで/etc/rc.localはないと思います/etc/init.d/rc.local
UpTheCreek '21

/Up/Cr.localがこれを追加するのにより適切な場所であるという@UpTheCreekに同意します。詳細な説明については、unix.stackexchange.com / a / 59945を参照してください。
オーバーイットイット

2
また、「現在の作業ディレクトリ」を指定して、app.js相対ファイルが正しく読み込まれるようにすることもできます process.chdir('/your/path/to/your/app'); -Node.js ref docs here
So Over It

1
あなたは、次の行を追加する(特急用$ PORTのように)あなたのNode.jsスクリプトの設定環境変数に必要がある場合は/etc/rc.local私のためのトリックをした:( cd /path/to/project && /usr/bin/sudo -u {{user}} env PORT={{port number}} PATH=$PATH:/usr/local/bin sh -c "forever start app.js" )
SFFC

25
  1. NPMを使用してPM2をグローバルにインストールする

    npm install pm2 -g

  2. スクリプトをpm2で開始します

    pm2 start app.js

  3. アクティブな起動スクリプトを生成する

    pm2 startup

    注:pm2起動は、システムの再起動時にPM2を起動するためのものです。PM2はいったん開始すると、システムがダウンする前に管理していたすべてのプロセスを再起動します。

自動起動を無効にしたい場合は、単にpm2 unstartupを使用してください

起動スクリプトを別のユーザーで実行する場合は、-u <username>オプションと--hp <user_home>:


複数の質問に同じ回答を投稿しないでください。
FelixSFD

私はpm2がどのように洗練されているかを本当に気に入っており、素晴らしい監視ツールが付属しています。これが他の人のためにもっと強調されることを願っています @ rv7これを見たことがあると思いますが、Windowsソリューションnpmjs.com/package/pm2-windows-serviceがあります。自分で試したことがありません。
ジョン・リー・

11

この答えとこれに触発された代替のcrontabメソッドブログ投稿に。

1. bashスクリプトファイルを作成します(bobを目的のユーザーに変更します)。

vi /home/bob/node_server_init.sh

2.作成したファイル内にこれをコピーして貼り付けます。

#!/bin/sh

export NODE_ENV=production
export PATH=/usr/local/bin:$PATH
forever start /node/server/path/server.js > /dev/null

設定に従って上記のパスを編集してください!

3. bashスクリプトが実行できることを確認します。

chmod 700 /home/bob/node_server_init.sh

4. bashスクリプトをテストします。

sh /home/bob/node_server_init.sh

5.「bob」をノードのランタイムユーザーに置き換えます。

crontab -u bob -e

6.コピーして貼り付けます(bobを目的のユーザーに変更します)。

@reboot /bin/sh /home/bob/node_server_init.sh

crontabを保存します。

最後までやり遂げました。賞品は再起動です(テストするためです):)


この方法が私にとって最も効果的でした。server.jsファイルへのフルパスを指定すると、いつまでも終了します。同じディレクトリで実行すると、foreveerは正常に動作します。失敗した理由は、server.jsファイルに他のファイルが含まれているためですが、パスがめちゃくちゃになりました。この方法を使用して、.shスクリプトをディレクトリに移動して、そこに関連するすべてのものを実行できます。
BeardedGeek 2015

9

添付の質問からの回答をコピーしたもの

PM2を使用できます。これは、ロードバランサーが組み込まれたNode.jsアプリケーションのプロダクションプロセスマネージャーです。

PM2をインストールする

$ npm install pm2 -g

アプリケーションを開始する

$ pm2 start app.js

Expressを使用している場合は、次のようにアプリを起動できます

pm2 start ./bin/www --name="app"

実行中のすべてのプロセスのリスト:

$ pm2 list

すべてのプロセスがリストされます。その後、次のコマンドでアプリのIDまたは名前を使用して、サービスを停止/再開できます。

$ pm2 stop all                  
$ pm2 stop 0                    
$ pm2 restart all               

ログを表示するには

$ pm2 logs ['all'|app_name|app_id]

システムの起動時にどのように自動的に起動しますか?CLIの手動入力をコピーして貼り付けただけ
Green

@Green、実行、$pm2 startupその後、pm2が手動でコマンドを実行し、それをコピーして実行するように求めるメッセージが表示されます。その後、$pm2 saveapp.jsはシステムの再起動後も存続します
yajnesh

7

そのために、/ etc / init.dフォルダーにシェルスクリプトを作成する必要があります。これまで行ったことがない場合は少し複雑ですが、init.dスクリプトに関するWeb上の情報はたくさんあります。

以下は、CoffeeScriptサイトを永久に実行するために作成したサンプルスクリプトです。

#!/bin/bash
#
# initd-example      Node init.d 
#
# chkconfig: 345 
# description: Script to start a coffee script application through forever
# processname: forever/coffeescript/node
# pidfile: /var/run/forever-initd-hectorcorrea.pid 
# logfile: /var/run/forever-initd-hectorcorrea.log
#
# Based on a script posted by https://gist.github.com/jinze at https://gist.github.com/3748766
#


# Source function library.
. /lib/lsb/init-functions


pidFile=/var/run/forever-initd-hectorcorrea.pid 
logFile=/var/run/forever-initd-hectorcorrea.log 

sourceDir=/home/hectorlinux/website
coffeeFile=app.coffee
scriptId=$sourceDir/$coffeeFile


start() {
    echo "Starting $scriptId"

    # This is found in the library referenced at the top of the script
    start_daemon

    # Start our CoffeeScript app through forever
    # Notice that we change the PATH because on reboot
    # the PATH does not include the path to node.
    # Launching forever or coffee with a full path
    # does not work unless we set the PATH.
    cd $sourceDir
    PATH=/usr/local/bin:$PATH
    NODE_ENV=production PORT=80 forever start --pidFile $pidFile -l $logFile -a -d --sourceDir $sourceDir/ -c coffee $coffeeFile

    RETVAL=$?
}

restart() {
    echo -n "Restarting $scriptId"
    /usr/local/bin/forever restart $scriptId
    RETVAL=$?
}

stop() {
    echo -n "Shutting down $scriptId"
    /usr/local/bin/forever stop $scriptId
    RETVAL=$?
}

status() {
    echo -n "Status $scriptId"
    /usr/local/bin/forever list
    RETVAL=$?
}


case "$1" in
    start)
        start
        ;;
    stop)
        stop
        ;;
    status)
        status
        ;;
    restart)
        restart
        ;;
    *)
        echo "Usage:  {start|stop|status|restart}"
        exit 1
        ;;
esac
exit $RETVAL

init.dスクリプトはrootとして実行されるため、フォルダーとPATHが明示的に設定されているか、rootユーザーが使用できることを確認する必要がありました。


2
init.dで開始される依存関係がある場合でも、読み込み順序の問題がある可能性があります。
UpTheCreek 2013年

@ alexandru.topliceanuリンクを修正しました。
Hector Correa

6

PM2を使用する

サーバー運用サーバーを実行するのに最適なオプションはどれですか

この方法でアプリケーションを実行する利点は何ですか?

  • PM2は、クラッシュするとアプリケーションを自動的に再起動します。

  • PM2は、未処理の例外のログを保持します-この場合、/ home / safeuser / .pm2 / logs / app-err.logにあるファイルに保存されます。

  • 1つのコマンドで、PM2は、サーバーが再起動したときに、管理するすべてのアプリケーションが確実に再起動するようにします。基本的に、ノードアプリケーションはサービスとして起動します。

参照:https : //www.digitalocean.com/community/tutorials/how-to-use-pm2-to-setup-a-node-js-production-environment-on-an-ubuntu-vps


5

ノードアプリケーションをサービスとして実行するように設計されていません。正しい方法は、/ etc / inittabエントリ(古いLinuxシステム)またはアップスタート(新しいLinuxシステム)を作成することです。

これをアップスタートとして設定する方法に関するいくつかのドキュメントがあります:https : //github.com/cvee/node-upstart


CentOSでUpstartに失敗し、消えてしまうと読みました。init.dエントリを作成することは、実際には最もユーザーフレンドリーな方法ではありませんが、
おそらく

5

crontabCentOS x86 6.5では動作しません。@rebootが機能していないようです。

最後に私はこの解決策を得ました:

編集: /etc/rc.local

sudo vi /etc/rc.local

この行をファイルの最後に追加します。変更USER_NAMEPATH_TO_PROJECTあなた自身に。NODE_ENV=productionアプリが本番モードで実行されることを意味します。複数のnode.jsアプリを実行する必要がある場合は、行を追加できます。

su - USER_NAME -c "NODE_ENV=production /usr/local/bin/forever start /PATH_TO_PROJECT/app.js"

NODE_ENV別の行で設定しないでください。アプリは永久に取得されないため、開発モードで実行されますNODE_ENV

# WRONG!
su - USER_NAME -c "export NODE_ENV=production"

保存してviを終了(プレス ESC : w q return)。サーバーを再起動してみてください。サーバーが再起動すると、sshを介してリモートでアカウントにログインしていなくても、node.jsアプリが自動的に実行されます。

NODE_ENVシェルで環境を設定する方がよいでしょう。NODE_ENVアカウントにUSER_NAMEログインすると自動的に設定されます。

echo export NODE_ENV=production >> ~/.bash_profile

したがって/PATH_TO_PROJECT/app.js、sshを介してforever stop / startなどのコマンドをNODE_ENV再設定せずに実行できます。


debian 7.6でも同じ問題が発生しました。これで解決しました。どうもありがとう。
Daniele Vrut 2014

「永遠に」使用したくない場合に備えて、行を「su-USER_NAME -c "NODE_ENV = production node / PATH_TO_PROJECT / bin / www"」に変更できます。
yaobin

3

私はまさにこれを行うスクリプトを書きました:

https://github.com/chovy/node-startup

私は永遠に試したことはありませんが、実行するコマンドをカスタマイズできるので、簡単なはずです。

/etc/init.d/node-app start
/etc/init.d/node-app restart
/etc/init.d/node-app stop

1

上記の答えをたくさん試しました。それらのどれも私のために働いていません。私のアプリは/homerootではなく、ユーザーとしてインストールされています。これはおそらく、上記の起動スクリプトが実行されると、/homeされたときにまだマウントされていないため、アプリが起動されていないます。

それから私はデジタルオーシャンによるこれらの指示を見つけました:

https://www.digitalocean.com/community/tutorials/how-to-use-pm2-to-setup-a-node-js-production-environment-on-an-ubuntu-vps

説明されているようにPM2を使用すると、非常にシンプルで完全に機能しました。仮想サーバーで2つの物理的なクラッシュが発生したため、ダウンタイムはわずか1分程度でした。


PM2は、githubに恒久的によりもはるかに多くの星(2x)を持ち、さらに多くの機能を備えています。答えのほとんどはここでは時代遅れだと思います。
inf3rno 2016

1

rc.localの問題は、ユーザーとしてログインしてsudoを使用するのとは異なり、コマンドがrootとしてアクセスされることです。

etc / profile.dに必要な起動コマンドを含む.shスクリプトを追加することで、この問題を解決しました。profile.d内の.shファイルは自動的にロードされ、コマンドは通常のsudoを使用した場合と同様に処理されます。

これの唯一の欠点は、指定されたユーザーが開始するためにログインする必要があることです。これは、私の状況では常にそうでした。


0

完全な例のcrontab(/ etc / crontabにあります)..

#!/bin/bash

# edit this file with .. crontab -u root -e
# view this file with .. crontab -u root -l

# put your path here if it differs
PATH=/root/bin:/root/.local/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/snap/bin

# * * * * * echo "executes once every minute" > /root/deleteme

@reboot cd /root/bible-api-dbt-server; npm run forever;
@reboot cd /root/database-api-server; npm run forever;
@reboot cd /root/mailer-api-server; npm run forever;

-1

シェルで次のコマンドを使用して、ノードを永久に起動できます。

forever app.js //my node script

アプリが実行されているサーバーは常にオンにしておく必要があることに注意してください。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.