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

对不起,如果题目是模糊的,但我试图用我的可能性来描述我的问题。 我有我想要部署到使用codeship我的覆盆子pi。 Rsyncing的文件工作完美,但是当我要重新启动我的应用程序使用pm2我的问题发生。

我已经使用节点版本pipe理器NVM安装了节点和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底部,但没有帮助。

完成部署后,如何重新启动应用程序? 预先感谢您的圣人build议和更好的智慧!

编辑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 :/ /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 :/ /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这是/home/pi/.nvm/versions/node/v4.2.0/bin/pm2的完整path,现在我得到以下错误: /usr/bin/env: node: No such file or directory

看来,即使我提供了完整的path,节点也不会执行。

我认为这个问题是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 … '/bin/bash -l -c "…"'

您也可以在服务器上编写一个专门的脚本,知道在交互式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'调用它。

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

就像Sukima说的那样,这可能是由于环境问题造成的 – SSH到服务器并没有建立一个完整的环境。 但是,你可以通过简单地在你的命令开始时用/ etc / profile来调用/ etc / profile来解决这个问题。 运算符(与“source”命令相同):

 ssh pi@server.com '. /etc/profile ; cd project; pm2 restart app.js -x -- --prod' 

/ etc / profile本身应该被设置为调用相关用户的.bashrc,这就是为什么我已经删除了这个部分。 我曾经在以前的工作场所做过很多快速的概念验证脚本。 我不知道这是否会被认为是一个更加永久的脚本的恶意破解,但它肯定是有效的,并且如果这是一个问题,将需要对现有脚本进行最小限度的修改。

尝试:

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

什么对我来说是加入到我的.bash_profile

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

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