1

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

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

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

显示 nvm ls 输出的图片

当我从常规 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 身份执行。

感谢您考虑这个问题。

4

1 回答 1

0

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

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

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

最简单的选择是编写一个脚本,用于su以 iotdemo 用户身份运行 node-red 并将其传递给 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 在脚本中工作的详细信息,请参阅此内容。

于 2018-06-21T20:52:29.910 回答