Penso che il problema sia l'errata interpretazione secondo cui il nodo di esecuzione della shell ha un ambiente completo come fa una sessione ssh interattiva. Molto probabilmente non è così.
Quando una sessione SSH genera una shell, passa attraverso molte rotazioni per creare un ambiente adatto a lavorare in modo interattivo. Cose come ereditare dal processo di accesso, leggere /etc/profile
, leggendo ~/.profile
. Ma nei casi in cui l'esecuzione diretta di bash non è sempre garantita. Infatti il $PATH
potrebbe essere completamente vuoto.
Quando /usr/bin/env node
esegue cerca il nodo nel tuo $PATH
che in una shell non interattiva potrebbe essere qualsiasi cosa o vuota.
La maggior parte dei sistemi ha un PATH=/bin:/usr/bin
predefinito tipicamente /usr/local/bin
non è incluso nell'ambiente predefinito.
Puoi tentare di forzare un login con ssh usando ssh … '/bin/bash -l -c "…"'
.
Puoi anche scrivere uno script specializzato sul server che sappia come dovrebbe essere l'ambiente quando viene eseguito al di fuori di una shell interattiva:
#!/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
Quindi chiamalo tramite ssh:ssh … '/usr/local/bin/my_script.sh'
.
Al di là di queste idee non vedo come aiutare ulteriormente.
Come ha detto Sukima, è probabile che ciò sia dovuto a un problema di ambiente:l'accesso tramite SSH a un server non configura un ambiente completo. Puoi, tuttavia, aggirare gran parte di questo semplicemente chiamando tu stesso /etc/profile all'inizio del tuo comando usando l'estensione . operatore (che è lo stesso del comando "source"):
ssh [email protected] '. /etc/profile ; cd project; pm2 restart app.js -x -- --prod'
/etc/profile dovrebbe essere esso stesso impostato per chiamare il .bashrc dell'utente pertinente, motivo per cui ho rimosso quella parte. In passato dovevo farlo parecchio per script di proof-of-concept rapidi in un posto di lavoro precedente. Non so se sarebbe considerato un brutto trucco per uno script più permanente, ma sicuramente funziona e richiederebbe modifiche minime allo script esistente se dovesse essere un problema.
Prova:
ssh [email protected] 'bash -l -c "source /home/pi/.bashrc; cd project; pm2 restart app.js -x -- --prod"'