web-dev-qa-db-ja.com

システムの起動時にNode.jsアプリを起動する方法は?

Node.jsアプリを実行しているRaspbianを実行しているRaspberryPiに取り組んでおり、Piの起動時に起動しようとしています。いくつか例を見つけましたが、うまくいかないようです。私の現在のコードは次のとおりです。

#! /bin/sh
# /etc/init.d/MyApp

### BEGIN INIT INFO
# Provides:          MyApp.js
# Required-Start:    $remote_fs $syslog
# Required-Stop:     $remote_fs $syslog
# Default-Start:     2 3 4 5
# Default-Stop:      0 1 6
# Short-Description: Starts MyApp.js
# Description:       Start / stop MyApp.js at boot / shutdown.
### END INIT INFO

# If you want a command to always run, put it here

# Carry out specific functions when asked to by the system
case "$1" in
   start)
    echo "Starting MyApp.js"
    # run application you want to start
    node /home/pi/app/MyApp/MyApp.js
   ;;
   stop)
    echo "Stopping MyApp.js"
    # kill application you want to stop
    killall MyApp.js
    ;;
  *)
    echo "Usage: /etc/init.d/MyApp {start|stop}"
    exit 1
    ;;
esac

exit 0

これはetc/init.dフォルダーにあり、chmod +x /etc/init.d/MyAppを実行しました。手動で実行できます。次に、Sudo update-rc.d MyApp defaultsを実行し、再起動すると、スクリプトが実行されません。私はいくつかの異なる例を見て、調整を行いましたが、それでも運がありません。

10
user2650875

.10.24 のようなビルド済みのPiリリースを使用している場合は、PATHの問題が発生している可能性があります。

startコマンドの一部としてノードバイナリへのフルパスを指定するか、/etc/init.d/MyAppを実行する前にノードバイナリへのPATHが設定されていることを確認できます。私は同じ問題を抱えていて、両方を試しましたが成功しました。また、お持ちのstopコマンドが機能していない可能性があります。

#! /bin/sh
# /etc/init.d/test

### BEGIN INIT INFO
# Provides:          test
# Required-Start:    $remote_fs $syslog
# Required-Stop:     $remote_fs $syslog
# Default-Start:     2 3 4 5
# Default-Stop:      0 1 6
# Short-Description: Example initscript
# Description:       This file should be used to construct scripts to be
#                    placed in /etc/init.d.
### END INIT INFO

# Carry out specific functions when asked to by the system
case "$1" in
   start)
    echo "Starting test.js"
    # run application you want to start
    #node /home/pi/test.js > /home/pi/test.log
    /home/pi/downloads/node-v0.10.24-linux-arm-pi/bin/node /home/pi/test.js >> /home/pi/test.log
   ;;
   stop)
    echo "Stopping test.js"
    # kill application you want to stop
    killall -9 node
    # Not a great approach for running
    # multiple node instances
    ;;
  *)
    echo "Usage: /etc/init.d/test {start|stop}"
    exit 1
    ;;
esac

exit 0

Sudo nodeを実行する場合は、Defaults secure_pathを使用してSudo visudoにPATHを追加できます。

また、クラッシュ後もプロセスを実行し続けるために、 forever のようなものを使用することをお勧めします。

4
Kevin Reilly

最初にnode.jsがRaspberryPiのどこにインストールされているかを確認することで、この問題を解決しました。

which node

これは私に与えました:

/usr/local/bin/node

Crontab構成を開きます。

Sudo crontab -e

次に、私のcrontabで:

@reboot Sudo /usr/local/bin/node <complete path to your .js app> &

保存して再起動すると、問題が解決します。

26
Mohit Athwani

Mohitは正しいですが、明確にするために、readlinkを使用して、後でcronジョブとして追加する必要があるNode.jsアプリのフルパスを見つけることができます。

readlink -f <<name of file >>

たとえば、readlink -f HAP-NodeJS/Core.js/home/pi/HAP-NodeJS/Core.jsになります

which nodeを使用して、node.jsがインストールされているフルパスを見つけることもできます

次に、Sudo crontab -eを使用して新しいcronジョブを作成し、最後に次のコードを追加します。

@reboot Sudo /usr/local/bin/node <<.js application path>> &

たとえば、私のコードは次のようになります。

@reboot Sudo /usr/local/bin/node /home/pi/HAP-NodeJS/Core.js &

再起動(または起動)すると、Node.jsが実行されます。これが物事をクリアすることを願っています。

8
Adeel C