2015-10-26 20 views
6

Scusa se il soggetto è vago, ma ho cercato di descrivere il mio problema al meglio delle mie possibilità. Ho il mio raspberry pi che voglio distribuire con l'uso della codifica. Rsyncing dei file funziona perfettamente, ma quando devo riavviare la mia applicazione utilizzando pm2 il mio problema si verifica.bash non carica il nodo sul comando ssh remoto

Ho installato nodo e pm2 utilizzando il gestore versione nodo NVM.

ssh [email protected] 'source /home/pi/.bashrc; cd project; pm2 restart app.js -x -- --prod'0 min 3 sec 
bash: pm2: command not found 

Ho anche aggiunto:

shopt -s expand_aliases nel profondo del mio bashrc, ma non aiuta.

Come posso riavviare la mia applicazione dopo aver eseguito una distribuzione? Grazie in anticipo per il tuo saggio consiglio e migliore saggezza!

EDIT 1: Il mio .bashrc http://pastie.org/10529200 mio $ PATH: /home/pi/.nvm/versions/node/v4.2.0/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/local/games:/usr/games

EDIT 2: ho aggiunto /home/pi/.nvm/versions/node/v4.2.0/bin/pm2 che è il percorso completo PM2 e ora ottengo il seguente errore: /usr/bin/env: node: No such file or directory

Sembra che anche se fornisco il percorso completo, il nodo non viene eseguito.

+0

è 'pm2' un alias? Se è così, probabilmente non funzionerà. È meglio scrivere uno script per gestirlo ed eseguire quello script. Anche il comando ssh che hai sta assumendo il tuo funzionamento in una shell, ma non è una buona ipotesi. Forse iniziando il comando ssh con '"/bin/bash -c 'source ....' "' che riporta al commento di uno script sopra riportato. Infine, il comando 'pm2' richiede una tty? senza l'opzione '-t' una tty non verrà assegnata. Alcuni programmi presumono di averne uno se viene solitamente eseguito da una shell interattiva a differenza dell'esempio che hai fornito. – Sukima

+0

Grazie per il suggerimento, purtroppo non avrebbe fatto alcuna differenza. Ho provato quello che hai suggerito, e ho anche aggiunto '/ bin/bash -c" nvm usa 4.2.0 "' per provare e abilitare il nodo. Sfortunatamente non funziona. '/ bin/bash: nvm: comando non trovato /bin/bash: pm2: comando non trovato' – Ms01

+0

Forse la soluzione è semplicemente installare il nodo anziché utilizzare un gestore delle versioni come nvm? Preferirei che l'NVM funzionasse poiché è molto più semplice cambiare le versioni. – Ms01

risposta

8

Penso che il problema sia l'errata interpretazione che il nodo di esecuzione della shell abbia un ambiente completo come una sessione ssh interattiva. Molto probabilmente questo non è il caso.

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 login, leggendo /etc/profile, leggendo ~/.profile. Ma nei casi in cui il tuo bash in esecuzione direttamente questo non è sempre garantito. Infatti lo $PATH potrebbe essere completamente vuoto.

Quando esegue /usr/bin/env node, cerca il nodo nel tuo $PATH che in una shell non interattiva potrebbe essere qualsiasi cosa o vuoto.

La maggior parte dei sistemi ha un valore predefinito PATH=/bin:/usr/bin in genere /usr/local/bin non è incluso nell'ambiente predefinito.

È possibile tentare di forzare un accesso con ssh utilizzando ssh … '/bin/bash -l -c "…"'.

È inoltre possibile scrivere uno script specializzata sul server che sa come l'ambiente dovrebbe essere quando 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 chiamare tramite ssh: ssh … '/usr/local/bin/my_script.sh'.

Oltre queste idee, non vedo come aiutare ulteriormente.

4

Prova:

ssh [email protected] 'bash -l -c "source /home/pi/.bashrc; cd project; pm2 restart app.js -x -- --prod"' 
5

Come Sukima detto, la probabilità è che questo è a causa di un problema di ambiente - SSH'ing in un server non configurato un ambiente completo. Tuttavia, è possibile evitare gran parte di ciò semplicemente chiamando/etc/profile all'inizio del comando usando il comando.operatore (che è lo stesso del comando "source"):

ssh [email protected] '. /etc/profile ; cd project; pm2 restart app.js -x -- --prod' 

/etc/profile dovrebbe esso stesso essere impostato per chiamare il .bashrc dell'utente rilevante, ecco perché ho rimosso quella parte. Dovevo farlo parecchio per script di proof-of-concept veloci in un posto di lavoro precedente. Non so se sarebbe considerato un brutto scherzo per uno script più permanente, ma sicuramente funziona, e richiederebbe modifiche minime al tuo script esistente dovrebbe essere un problema.

Problemi correlati