bash不会在远程ssh命令上加载节点

时间:2015-10-26 23:13:55

标签: linux node.js bash ssh codeship

如果主题含糊不清,请原谅我,但我试图尽可能地描述我的问题。我有我的树莓派,我想部署使用代码。 Rsyncing文件工作正常,但当我使用pm2重新启动我的应用程序时,我的问题出现了。

我已使用节点版本管理器NVM安装了node和pm2。

ssh pi@server.com 'source /home/pi/.bashrc; cd project; pm2 restart app.js -x -- --prod'0 min 3 sec
bash: pm2: command not found

我甚至添加了:

shopt -s expand_aliases底部的

bashrc,但它没有帮助。

在完成部署后,如何让它重新启动我的应用程序?提前感谢您的圣人建议和更好的智慧!

编辑1 :我的.bashrc http://pastie.org/10529200 我的$ PATH:/home/pi/.nvm/versions/node/v4.2.0/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/local/games:/usr/games

编辑2 :我添加了/home/pi/.nvm/versions/node/v4.2.0/bin/pm2这是pm2的完整路径,现在我收到以下错误:/usr/bin/env: node: No such file or directory

似乎即使我提供完整路径,节点也不会被执行。

6 个答案:

答案 0 :(得分:11)

我认为问题在于错误解释shell执行节点具有像交互式ssh会话那样的完整环境。很可能情况并非如此。

当SSH会话产生一个shell时,它经历了很多旋转,以构建一个适合交互式工作的环境。比如继承登录流程,阅读/etc/profile,阅读~/.profile。但是在你直接执行bash的情况下,这并不总能得到保证。实际上$PATH可能完全是空的。

/usr/bin/env node执行时,它会在$PATH中查找非交互式shell中的节点或空的节点。

大多数系统都有默认PATH=/bin:/usr/bin默认环境中不包含/usr/local/bin

您可以尝试使用ssh … '/bin/bash -l -c "…"'强制使用ssh登录。

您还可以在服务器上编写一个专门的脚本,该脚本在交互式shell外部执行时知道环境应该如何:

#!/bin/bash
# Example shell script; filename: /usr/local/bin/my_script.sh
export PATH=$PATH:/usr/local/bin
export NODE_PATH=/usr/local/share/node
export USER=myuser
export HOME=/home/myuser
source $HOME/.nvm/nvm.sh
cd /usr/bin/share/my_script
nvm use 0.12
/usr/bin/env node ./script_name.js

然后通过ssh:ssh … '/usr/local/bin/my_script.sh'调用它。

除了这些想法,我不知道如何进一步提供帮助。

答案 1 :(得分:7)

就像Sukima所说,可能是因为环境问题 - SSH进入服务器并没有建立完整的环境。但是,您可以通过简单地在命令开头使用自己调用/ etc / profile来解决大部分问题。 operator(与" source"命令相同):

print_r($this->myname); 

/ etc / profile本身应设置为调用相关用户的.bashrc,这就是我删除该部分的原因。在以前的工作场所,我曾经非常需要为快速概念验证脚本做很多事情。我不知道它是否会被认为是一个更为永久性的脚本令人讨厌的黑客,但它确实有效,并且如果这是一个问题,则需要对现有脚本进行最少的修改。

答案 2 :(得分:5)

尝试:

ssh pi@server.com 'bash -l -c "source /home/pi/.bashrc; cd project; pm2 restart app.js -x -- --prod"'

答案 3 :(得分:1)

对我有用的是将其添加到我的.bash_profile

if [ -f ~/.bashrc ]; then
  . ~/.bashrc
fi

来源:https://stackoverflow.com/a/820533/1824444

答案 4 :(得分:1)

对我来说,我必须在安装node and yarn using :nvm时加载:nvm

要在ssh远程执行时加载:nvm,我们调用

Intents.intentdefinition

答案 5 :(得分:0)

您应通过“源”或点命令“。”启用某些环境值。这是一个例子。

ssh pi@server.com '. /home/pi/.nvm.nvm.sh; cd project; pm2 restart app.js -x -- --prod'