Ssh

nohup: failed to run command 'node': No such file or directory 當通過 ssh 執行腳本時

  • May 12, 2022

我有一個遠端伺服器,我在其中使用節點(express)和 nginx 為網路伺服器提供服務。我有一個./devops/deploy.sh啟動網路伺服器並重新啟動 nginx 的腳本。如果我手動連接到實例 ( 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 &

通過簡單地給出不帶路徑的名稱來執行執行檔(在本例中為node),要求該文件位於環境變數中指定的目錄之一中PATH。該變數的確切內容往往因執行 shell 的不同方式而異,例如互動式登錄或啟動腳本。您的node執行檔可能位於PATH您以互動方式登錄時列出的目錄中,但如果您執行腳本則不會。

基本上有兩種方法可以解決這個問題:

  1. 在腳本開頭顯式設置PATH變數以包含腳本打算從中執行執行檔的所有目錄。不要忘記包含/binand/usr/bin因為這是標準命令所在的位置。因此,例如,如果您的node執行檔位於/opt/MyPrettyDevops/bin,您將添加該行
export PATH=/bin:/usr/bin:/opt/MyPrettyDevops/bin
  1. 通過將行node更改為明確指定執行檔的路徑nohup
nohup /opt/MyPrettyDevops/bin/node runner.js &

引用自:https://serverfault.com/questions/1100780