如何在openwrt上自动启动nodejs应用 - Arduino Yun -

How to start nodejs application automatically on openwrt - Arduino Yun -

我正在尝试让 nodejs 应用程序在系统启动时自动启动。基本上我需要的只是 运行 命令 node /dir/app。 我在 Arduino Yun 上使用 openwrt。并尝试了一些东西。

在openwrt网站上说我可以做到这一点。 https://wiki.openwrt.org/inbox/procd-init-scripts :

#!/bin/sh /etc/rc.common
USE_PROCD=1
start_service() {
  procd_open_instance
  procd_set_param command node ///www/www-blink.js
  procd_close_instance
}

我也试过将目录更改为 /www/www-blink.js 而不是 ///

但是我不确定我做错了什么,因为当我用 运行 尝试 /etc/init.d/node-app start 时什么也没有出现 我显然写错了代码,但我不确定是什么它应该完全像。

我尝试过的另一件事是节点模块 foreverforever-service。 我使用 npm install -g forever 和永久服务将它们下载到我的计算机上。我将它们转移到我的 arduino yun 上的 usr/lib/node_modules。但是,当我尝试使用和 forever(-service) 命令时,它说

-ash: forever: not found

我尝试了其他一些方法,但是没有任何效果。任何帮助将不胜感激。

-- 我还需要能够使用 npm start 而不是 node app 来启动我的 express 脚本,但我想首先要做的是让它正常工作。

您需要像 Linux Service 一样执行您的 node 应用程序。

Upstart 非常适合这项任务

Upstart is an event-based replacement for the /sbin/init daemon which handles starting of tasks and services during boot, stopping them during shutdown and supervising them while the system is running.

如果您有这样的应用程序(例如):

// app.js
var express = require('express')  
var app = express()  
var port = process.env.PORT

app.get('/', function(req, res) {  
  res.send('Hello world!')
})

app.listen(port)

像这样的package.json

{
  "name": "my-awesome-app",
  "version": "1.0.0",
  "dependencies": {
     "express": "^4.13.3"
  },
  "scripts": {
     "start": "node app.js"
  }
}

我们使用以下代码创建一个名为 myAwesomeApp.conf 的 upstart 配置文件:

start on runlevel [2345]  
stop on runlevel [!2345]

respawn  
respawn limit 10 5

setuid ubuntu  
chdir /opt/myAwesomeApp.conf

env PORT=3000

exec npm start 

最后,将您的应用程序(app.jspackage.json)放入 /opt/myAwesomeApp.conf 并将配置文件 myAwesomeApp.conf 复制到 /etc/init/

就这些了,现在您只需要 运行 service myAwesomeApp start 到 运行 您的节点应用程序即服务

我以前从未使用过 procd,但它可能需要 node 的完整路径(例如 /usr/bin/node)。您需要使该行类似于 procd_set_param command /usr/bin/node /www/www-blink.js,假设您想要 运行 的文件是 /www/www-blink.js。您可以通过 运行ning which nodetype -a node.

定位节点

你可以把启动命令(node /dir/app &)放在/etc/rc.local脚本中。这将在系统启动时自动启动您的 nodejs 应用程序。

OpenWRT procd有一个"respawn"参数,会重启一个退出或崩溃的服务

# respawn automatically if something died, be careful if you have an 
# alternative process supervisor if process dies sooner than respawn_threshold,
# it is considered crashed and after 5 retries the service is stopped

procd_set_param respawn ${respawn_threshold:-3600} ${respawn_timeout:-5} ${respawn_retry:-5}

所以,你冷只是补充: procd_set_param 重生 60 5 5

或类似的东西到你的 OpenWRT procd initscript。这个 60 5 5 意味着它将在两次重生之间等待 5 秒(中间参数),如果它在 60 秒(第一个参数)内重生超过 5 次(最后一个参数),它将禁用该服务("restart loop" 检测到)。

有关详细信息,请参阅此页面: https://openwrt.org/docs/guide-developer/procd-init-scripts