Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux bash不';t在远程ssh命令上加载节点_Linux_Node.js_Bash_Ssh_Codeship - Fatal编程技术网

Linux bash不';t在远程ssh命令上加载节点

Linux bash不';t在远程ssh命令上加载节点,linux,node.js,bash,ssh,codeship,Linux,Node.js,Bash,Ssh,Codeship,对不起,如果这个问题含糊不清,我会尽力描述我的问题。我有我的raspberry pi,我想使用codeship部署它。Rsyncing文件工作得很好,但是当我要使用pm2重新启动应用程序时,我的问题就出现了 我已经使用node version manager NVM安装了node和pm2 ssh pi@server.com 'source /home/pi/.bashrc; cd project; pm2 restart app.js -x -- --prod'0 min 3 sec bash:

对不起,如果这个问题含糊不清,我会尽力描述我的问题。我有我的raspberry pi,我想使用codeship部署它。Rsyncing文件工作得很好,但是当我要使用
pm2
重新启动应用程序时,我的问题就出现了

我已经使用node version manager 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在my
bashrc
的底部展开\u别名,但它没有帮助

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

编辑1:My.bashrc 我的$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/games

编辑2:我添加了
/home/pi/.nvm/versions/node/v4.2.0/bin/pm2
,这是pm2的完整路径,现在我得到以下错误:
/usr/bin/env:node:没有这样的文件或目录


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

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

当SSH会话生成一个shell时,它会经历许多旋转来构建一个适合交互使用的环境。例如从登录过程继承、读取
/etc/profile
、读取
~/.profile
。但是在直接执行bash的情况下,这并不总是可以保证的。实际上,
$PATH
可能完全为空

当执行
/usr/bin/env node
时,它会在非交互式shell中的
$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'

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

试试:

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

正如Sukima所说,这可能是由于环境问题造成的——SSH’ing到服务器并没有设置完整的环境。但是,您可以通过在命令开始时使用。运算符(与“源”命令相同):


/etc/profile本身应该设置为调用相关用户的.bashrc,这就是我删除该部分的原因。在以前的工作场所,为了快速验证概念脚本,我经常要这么做。我不知道这是否会被认为是对更持久的脚本的恶意攻击,但它确实有效,如果这是一个问题,则需要对现有脚本进行最小的修改。

对我有效的方法是将此添加到我的
。bash\u配置文件中

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

源:

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

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

对于我来说,我必须在安装时加载:nvm

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

ssh :user@:host 'source ~/.nvm/nvm.sh; :other_commands_here'

pm2
是别名吗?如果是这样的话,它可能不会起作用。您最好编写一个脚本来处理此问题并执行该脚本。另外,您使用的ssh命令假设您在shell中运行,但这不是一个好的假设。可能是用
“/bin/bash-c'source…”
启动ssh命令,这将返回到上面的“编写脚本”注释。最后,
pm2
命令是否需要tty?如果没有
-t
选项,将不会分配tty。与您提供的示例不同,如果它通常是从交互式shell执行的,则某些程序会假定您有一个。感谢您的建议,遗憾的是,它不会有任何区别。尝试了您的建议,甚至添加了
/bin/bash-c“nvm使用4.2.0”
来尝试启用节点。不幸的是,它不起作用
/bin/bash:nvm:command-not-found/bin/bash:pm2:command-not-found
也许解决方案是简单地安装节点,而不是使用像nvm这样的版本管理器?我倾向于让nvm工作,因为它更容易切换版本。请显示您的
/home/pi/.bashrc
文件和
echo$PATH
输出。nvm是一个函数,因此必须在shell中提供。如果您使用
bash-c
执行此操作,那么它将不起作用,因为一旦-c完成,bash shell将退出,并且其中创建的任何环境都将消失。你有路径问题<代码>/bin/bash-c'echo$PATH'
并查看缺少的内容。(单引号而非双引号)。这类似于@kevinYang answer,原因是
bash-l-c
不适用于我的案例-我通过nvm安装的节点,原因是
bash-l-c
不适用于我的案例-我通过nvm安装的节点
ssh :user@:host 'source ~/.nvm/nvm.sh; :other_commands_here'