Myslím, že problém je v nesprávné interpretaci, že uzel spouštějící shell má plné prostředí jako interaktivní relace ssh. S největší pravděpodobností tomu tak není.
Když relace SSH vytvoří shell, prochází mnoha změnami, aby se vytvořilo prostředí vhodné pro interaktivní práci. Věci jako dědění z procesu přihlášení, čtení /etc/profile
, čtení ~/.profile
. Ale v případech, kdy provádíte bash přímo, to není vždy zaručeno. Ve skutečnosti $PATH
může být úplně prázdný.
Když /usr/bin/env node
spustí, hledá uzel ve vašem $PATH
který v neinteraktivním shellu může být cokoli nebo prázdný.
Většina systémů má výchozí PATH=/bin:/usr/bin
obvykle /usr/local/bin
není součástí výchozího prostředí.
Můžete se pokusit vynutit přihlášení pomocí ssh pomocí ssh … '/bin/bash -l -c "…"'
.
Můžete také napsat specializovaný skript na serveru, který ví, jak by mělo prostředí vypadat při spuštění mimo interaktivní shell:
#!/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
Pak to zavolejte přes ssh:ssh … '/usr/local/bin/my_script.sh'
.
Kromě těchto nápadů nevidím, jak dále pomoci.
Jak řekl Sukima, je pravděpodobné, že je to způsobeno problémem s prostředím - připojení SSH na server nenastaví úplné prostředí. Většinu z toho však můžete obejít jednoduše zavoláním /etc/profile na začátku vašeho příkazu pomocí . operátor (který je stejný jako příkaz "source"):
ssh [email protected] '. /etc/profile ; cd project; pm2 restart app.js -x -- --prod'
/etc/profile by měl být nastaven tak, aby volal .bashrc příslušného uživatele, proto jsem tuto část odstranil. Dřív jsem toho musel dělat poměrně často pro rychlé skripty pro ověření konceptu na předchozím pracovišti. Nevím, jestli by to bylo považováno za ošklivý hack pro trvalejší skript, ale určitě to funguje a pokud by to byl problém, vyžadovalo by to minimální úpravy vašeho stávajícího skriptu.
Zkuste:
ssh [email protected] 'bash -l -c "source /home/pi/.bashrc; cd project; pm2 restart app.js -x -- --prod"'