【问题标题】:Trouble with Node-Red and node.js version running in a netns在 netns 中运行的 Node-Red 和 node.js 版本出现问题
【发布时间】:2018-06-21 19:05:11
【问题描述】:

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

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

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

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

感谢您考虑这个问题。

【问题讨论】:

  • 如果您以 root 身份运行 node -version 会发生什么?
  • @hardillb 如果我输入 sudo node -v 输出正确显示 v8.11.3 ;如果我输入 sudo su - 然后运行 ​​node -v 我会得到旧版本显示为 v4.2.6
  • 那不改变环境,运行sudo su -然后运行node -version

标签: node.js node-red nvm linux-namespaces


【解决方案1】:

通过安装 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 在脚本中工作的详细信息,请参阅 this

【讨论】:

  • 我按照上面的说明进行操作,通过调用脚本来启动 node-red,但即使用户目录和设置文件指向 /home/iotdemo/,它仍然显示 v4.2.6 正在运行.node-red
  • 我已经更新了脚本以明确强制 nvm 使用一个版本
  • 这会产生一个我之前注意到的错误 - 我尝试从脚本调用 nvm 但它没有运行。在遵循您的指示的情况下,我得到: exec: nvm: command not found。实际上,如果我尝试以 root 身份执行 nvm,我会得到“找不到命令”,因此无论出于何种原因,nvm 都不能作为 root 使用
  • nvm 在我的示例中没有以 root 身份运行,它应该以 iotdemo 身份运行,su 后的 - 应该确保 iotdemo 的环境设置正确
  • 好的,看起来 nvm 是一个 shell 命令而不是脚本/可执行文件。尝试新版本的脚本和ip netns 命令
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-07-21
  • 1970-01-01
  • 2019-10-30
相关资源
最近更新 更多