对不起,如果题目是模糊的,但我试图用我的可能性来描述我的问题。 我有我想要部署到使用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