Creo que el problema es la interpretación errónea de que el nodo de ejecución del shell tiene un entorno completo como lo hace una sesión ssh interactiva. Lo más probable es que este no sea el caso.
Cuando una sesión SSH genera un caparazón, pasa por muchos giros para construir un entorno adecuado para trabajar de forma interactiva. Cosas como heredar del proceso de inicio de sesión, leer /etc/profile
, leyendo ~/.profile
. Pero en los casos en los que ejecuta bash directamente, esto no siempre está garantizado. De hecho, el $PATH
podría estar completamente vacío.
Cuando /usr/bin/env node
lo ejecuta busca el nodo en su $PATH
que en un shell no interactivo podría ser cualquier cosa o vacío.
La mayoría de los sistemas tienen un PATH=/bin:/usr/bin
predeterminado típicamente /usr/local/bin
no está incluido en el entorno predeterminado.
Podría intentar forzar un inicio de sesión con ssh usando ssh … '/bin/bash -l -c "…"'
.
También puede escribir un script especializado en el servidor que sepa cómo debe ser el entorno cuando se ejecuta fuera de un shell interactivo:
#!/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
Luego llámalo a través de ssh:ssh … '/usr/local/bin/my_script.sh'
.
Más allá de estas ideas, no veo cómo ayudar más.
Como dijo Sukima, lo más probable es que esto se deba a un problema del entorno:SSH'ing en un servidor no configura un entorno completo. Sin embargo, puede evitar gran parte de esto simplemente llamando a /etc/profile usted mismo al comienzo de su comando usando la extensión . operador (que es lo mismo que el comando "fuente"):
ssh [email protected] '. /etc/profile ; cd project; pm2 restart app.js -x -- --prod'
/etc/profile debe configurarse para llamar al .bashrc del usuario relevante, razón por la cual eliminé esa parte. Solía tener que hacer esto bastante para obtener guiones de prueba de concepto rápidos en un lugar de trabajo anterior. No sé si se consideraría un truco desagradable para una secuencia de comandos más permanente, pero sin duda funciona y requeriría una modificación mínima de su secuencia de comandos existente si eso fuera un problema.
Prueba:
ssh [email protected] 'bash -l -c "source /home/pi/.bashrc; cd project; pm2 restart app.js -x -- --prod"'