通过 ssh 运行脚本时出现“nohup:无法运行命令‘node’:没有此文件或目录”

通过 ssh 运行脚本时出现“nohup:无法运行命令‘node’:没有此文件或目录”

我有一个远程服务器,在其中使用 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.shssh ... << EOF <content here> EOFnohup: 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,但如果您运行脚本,则不会。

基本上有两种方法可以解决这个问题:

  1. PATH在脚本开头明确设置变量,以包含脚本打算从中运行可执行文件的所有目录。不要忘记包含/bin和,/usr/bin因为标准命令驻留在其中。因此,例如,如果您的node可执行文件位于中/opt/MyPrettyDevops/bin,则应添加以下行

    export PATH=/bin:/usr/bin:/opt/MyPrettyDevops/bin
    
  2. 通过将行node更改为明确指定可执行文件的路径nohup

    nohup /opt/MyPrettyDevops/bin/node runner.js &
    

相关内容