11

如果主题含糊不清,请原谅,但我试图尽我所能描述我的问题。我有我的树莓派,我想使用 codeship 部署它。Rsyncing 文件完美地工作,但是当我使用pm2我的问题重新启动我的应用程序时。

我已经使用节点版本管理器 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但它没有帮助。

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

编辑 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

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

4

6 回答 6

20

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

当一个 SSH 会话产生一个 shell 时,它会经历很多的变化来构建一个适合交互工作的环境。/etc/profile诸如从登录过程继承,阅读,阅读之类的事情~/.profile。但是在您直接执行 bash 的情况下,这并不总是得到保证。事实上,$PATH可能是完全空的。

执行时,它会在您的非交互式外壳中/usr/bin/env node查找节点,该节点可以是任何内容或为空。$PATH

大多数系统都有一个默认的PATH=/bin:/usr/bin通常/usr/local/bin不包含在默认环境中。

您可以尝试使用 ssh 强制登录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'

除了这些想法之外,我看不到如何进一步提供帮助。

于 2015-11-04T23:31:10.563 回答
7

就像 Sukima 所说,这很可能是由于环境问题 - SSH 进入服务器并没有设置完整的环境。但是,您可以通过在命令开始时使用 . 运算符(与“source”命令相同):

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

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

于 2015-11-10T12:22:14.170 回答
5

尝试:

ssh pi@server.com 'bash -l -c "source /home/pi/.bashrc; cd project; pm2 restart app.js -x -- --prod"'
于 2015-11-06T15:28:46.067 回答
5

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

ssh pi@server.com '. /home/pi/.nvm/nvm.sh; cd project; pm2 restart app.js -x -- --prod'
于 2018-11-27T09:21:10.970 回答
4

对我来说,当我使用 :nvm 安装节点和纱线时,我必须加载 : nvm

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

ssh :user@:host 'source ~/.nvm/nvm.sh; :other_commands_here'
于 2020-02-05T10:06:33.897 回答
1

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

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

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

于 2016-03-13T12:17:00.723 回答