nohup: failed to run command 'node': No such file or directory
當通過 ssh 執行腳本時
我有一個遠端伺服器,我在其中使用節點(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
您以互動方式登錄時列出的目錄中,但如果您執行腳本則不會。基本上有兩種方法可以解決這個問題:
- 在腳本開頭顯式設置
PATH
變數以包含腳本打算從中執行執行檔的所有目錄。不要忘記包含/bin
and/usr/bin
因為這是標準命令所在的位置。因此,例如,如果您的node
執行檔位於/opt/MyPrettyDevops/bin
,您將添加該行export PATH=/bin:/usr/bin:/opt/MyPrettyDevops/bin
- 通過將行
node
更改為明確指定執行檔的路徑nohup
nohup /opt/MyPrettyDevops/bin/node runner.js &