netns 中的 Node-Red 和 node.js 版本 运行 出现问题

Trouble with Node-Red and node.js version running in a netns

我需要在我创建的 netns 中 运行 node-red。我在这个命名空间中有一个专用的调制解调器接口,只有 node-red 应该可以访问它。

我正在使用 Ubuntu 16.04 并安装了 npm -> 然后是 node.js 的 nvm 版本管理器来安装 8.11.3,然后是 node-red 本身。

我只安装了 nvm 版本 8.11.3 并将其设置为默认值。我希望这是唯一的版本 运行ning 任何地方。

当我从常规 shell 启动 node-red 时,它会以 node.js 版本 8.11.3

启动

当我在 netns 中启动 node-red 时,它也会使用 node.js 版本 8.11.3 [我使用 -u /directory 选项 运行 与普通用户相同的流程]

问题: 当我从自动 shell 脚本在 netns 中启动 node-red 时,它会使用 node.js 版本 4.9.1 而不是 [我使用 -u /directory 选项来 运行 相同的流程普通用户]

Welcome to Node-RED
===================

21 Jun 11:42:15 - [info] Node-RED version: v0.18.7
21 Jun 11:42:15 - [info] **Node.js  version: v4.2.6**
21 Jun 11:42:15 - [info] Linux 4.13.0-45-generic x64 LE

脚本中的启动行是:

ip netns exec sensor node-red -u /home/iotdemo/.node-red

"sensor" 是 netns 名称,-u 选项指向与普通用户相同的流目录。

为什么它以我什至没有安装的 node.js 版本启动,以及如何让它以所需的 v8.11.3 启动?

我怀疑它与 root 与用户 (iotdemo) 有关,但它似乎在命名空间中启动一个进程,您必须以 root 身份执行。

感谢您考虑这个问题。

通过安装 npm,您必须同时安装 NodeJS 作为先决条件(因为 npm 只是另一个 NodeJS 应用程序)。

这意味着您在系统级安装了版本为 v4.2.6 的 NodeJS

nvm 只是混淆用户路径,在系统 bin 目录之前插入搜索路径(例如 /bin /usr/bin /usr/local/bin),然后维护一组指向不同版本的符号链接节点JS。由于您将所有设置设置为用户 iotdemo,因此只有该用户将启用 nvm 路径,这就是为什么 root 用户仍然看到系统安装的 NodeJS 版本的原因。

最简单的选择是编写一个脚本,使用 su 到 运行 node-red 作为 iotdemo 用户并将其传递给 ip netns exec 命令。

例如

#!/bin/bash
. ~/.nvm/nvm.sh
nvm exec 8.11.3 node-red 

然后调用这个脚本

ip netns exec sensor su - iotdemo -c /path/to/script

有关让 nvm 在脚本中工作的详细信息,请参阅 this