我有一个远程服务器,在其中使用 node (express) 和 nginx 为 web 服务器提供服务。我有一个脚本可以启动 web 服务器并重新启动 nginx。如果我手动连接到实例 ( ) 然后运行,则./devops/deploy.sh
该脚本可以正常工作ssh <user>@<ip>
cd my-repo
git pull
./devops/deploy.sh
但是我无法设置一个脚本来自动执行此操作。我尝试使用此脚本
#!/bin/bash
set -euo pipefail
usage() {
cat << EOF
Usage: ./devops/update-instance.sh <user@ip>
EOF
exit -1
}
CONNECTION_STRING=${1:-""}
if [ -z $CONNECTION_STRING ]; then
usage
fi
ssh -t $CONNECTION_STRING << EOF
cd my-repo
git pull
./devops/deploy.sh
EOF
但它给了我nohup: failed to run command 'node': No such file or directory
。这是我从我的机器本地运行的部署脚本
#!/bin/bash
set -euo pipefail
lsof -ti:3000 && kill $(lsof -ti:3000)
echo bar
echo $(node -v)
nohup node runner.js &
NGINX_CONFIG_PATH=/etc/nginx/sites-enabled/my-repo
rm -rf $NGINX_CONFIG_PATH
cp devops/nginx-config $NGINX_CONFIG_PATH
nginx -t
nginx -s reload
node runner.js
只是启动一个快速应用程序,所以没有什么奇怪的。
我想要实现的目标与这篇文章非常相似https://askubuntu.com/questions/349262/run-a-nohup-command-over-ssh-then-disconnect但没有提到这个 nohup + node 错误。
查看后,我意识到我很可能在调用部署脚本时做错了什么,但我真的不明白这可能是什么。在更新脚本中,我尝试执行nohup ./devops/deploy.sh &
而不是简单,./devops/deploy.sh
但得到了同样的nohup: failed to run command 'node': No such file or directory
错误。如果我将脚本
的内容放入我也会得到同样的错误./devops/deploy.sh
ssh ... << EOF <content here> EOF
nohup: failed to run command 'node': No such file or directory
将 ssh 命令切换为
export NVM_DIR="\$HOME/.nvm"
\. "\$NVM_DIR/nvm.sh"
\. "\$NVM_DIR/bash_completion"
cd my-repo
git pull
nohup ./devops/deploy.sh 1>api.stdout 2>api.stderr &
答案1
运行可执行文件(在本例中为node
)时,只需给出其名称而不提供路径,则要求该文件位于环境变量 中指定的目录之一PATH
。该变量的确切内容往往因运行 shell 的不同方式而异,例如以交互方式登录或启动脚本。当您以交互方式登录时node
,可执行文件可能位于 中列出的目录中PATH
,但如果您运行脚本,则不会。
基本上有两种方法可以解决这个问题:
PATH
在脚本开头明确设置变量,以包含脚本打算从中运行可执行文件的所有目录。不要忘记包含/bin
和,/usr/bin
因为标准命令驻留在其中。因此,例如,如果您的node
可执行文件位于中/opt/MyPrettyDevops/bin
,则应添加以下行export PATH=/bin:/usr/bin:/opt/MyPrettyDevops/bin
通过将行
node
更改为明确指定可执行文件的路径nohup
nohup /opt/MyPrettyDevops/bin/node runner.js &