2015-10-26 17 views
6

Öznenin belirsiz olması durumunda özür dilerim, ancak sorunumu en iyi olasılıklarımla anlatmaya çalıştım. Kodlamayı kullanarak dağıtmak istediğim ahududu pi'm var. Dosyaları rsyncing mükemmel çalışır, ancak pm2 kullanarak benim uygulamayı yeniden başlatmak için sorunum oluşur.bash, uzak ssh komutunda düğüm yüklemiyor

Düğüm sürümü yöneticisi NVM'yi kullanarak düğüm ve pm2'yi yükledim. Benim bashrc dibinde

shopt -s expand_aliases ama yardımcı olmuyor:

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

Hatta ekledik.

Bir dağıtım yaptıktan sonra uygulamayı yeniden başlatmasını nasıl sağlayabilirim? Adaçayı tavsiye ve daha iyi bilgelik için şimdiden teşekkürler!

DÜZENLEME 1: My Bashrc http://pastie.org/10529200 Benim $ YOLU: 2/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

DÜZENLEME: /home/pi/.nvm/versions/node/v4.2.0/bin/pm2 eklendi şimdi um2'den tam yolu ve aşağıdaki hatayı alıyorum: /usr/bin/env: node: No such file or directory

Tam yol sağlasa bile, düğüm yürütülmez.

+0

'bir takma ad pm2' mı? Eğer öyleyse muhtemelen işe yaramaz. Bunu işlemek ve bu komut dosyasını yürütmek için bir komut dosyası yazmanız daha iyi olur. Ayrıca sahip olduğunuz ssh komutu, bir kabukta koştuğunuzu varsayar, ancak bu iyi bir varsayım değildir. Belki de ssh komutunuzu '/ bin/bash -c 'source ....' '' ile başlayarak, yukarıdaki betiklerin yazılmasına yol açar. Son olarak, 'pm2' komutu bir tty gerektiriyor mu? '-t' seçeneği dışında bir tty atanmayacaktır. Bazı programlar, sağladığınız örnekten farklı olarak etkileşimli bir kabuktan yürütülürse sahip olduğunuz varsayılır. – Sukima

+0

Öneriniz için teşekkürler, ne yazık ki herhangi bir fark olmaz. Önerdiğin şeyi denedim, ve hatta '/ bin/bash -c' nvm 'yi kullan ve denemeyi etkinleştir. Ne yazık ki işe yaramıyor. '/ bin/bash: nvm: komut bulunamadı/bin/bash: pm2: komut bulunamadı' – Ms01

+0

Belki de çözüm nvm gibi bir sürüm yöneticisi kullanmak yerine düğüm kurmaktır? Anahtarlama sürümleri çok daha kolay olduğu için nvm'yi çalıştırmayı tercih ederim. – Ms01

cevap

8

Sorun, kabuk yürütme düğümünün etkileşimli bir ssh oturumu gibi tam bir ortama sahip olmasının yanlış yorumlanması olduğunu düşünüyorum. Büyük olasılıkla böyle değil.

Bir SSH oturumu bir kabuk oluşturduğunda, etkileşimli olarak çalışmak için uygun bir ortam oluşturmak için çok sayıda geçiştirme yapılır. Giriş işleminden devralma gibi şeyler, /etc/profile, okuma ~/.profile. Ancak, direk yürütme direkinizin doğrudan bu durumda garanti edilmediği durumlarda. Aslında $PATH tamamen boş olabilir.

/usr/bin/env node yürütüldüğünde, $PATH düğümünde, etkileşimli olmayan bir kabukta herhangi bir şey veya boş olabilir düğüm bulunur.

Çoğu sistemde varsayılan PATH=/bin:/usr/bin varsayılan olarak /usr/local/bin varsayılan ortama dahil değildir. ssh … '/bin/bash -l -c "…"' kullanarak ssh ile oturum açmaya zorlayabilirsiniz.

Ayrıca interaktif bir kabuk dışında çalıştırıldığında ortam nasıl olması gerektiğini bilir sunucuda özel bir komut dosyası yazabilirsiniz:

#!/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 

Sonra ssh'dan diyoruz: ssh … '/usr/local/bin/my_script.sh'.

Bu fikirlerin ötesinde daha fazla nasıl yardımcı olabileceğimi göremiyorum.

4

Dene: Sukima Dediğim gibi

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

, olabilirlik bu bir ortam sorun nedeniyle olmasıdır - bir sunucuya SSH'ing tam ortamı kurmak değil. Bununla birlikte, bununla ilgili olarak,/etc/komutunu kullanarak kendi komutunuzun başlangıcında kendinizinkini arayarak bunun çoğunu alabilirsiniz.("Kaynak" komutu ile aynıdır) operatörü:

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

/etc/profile kendisi O bölümü kaldırdık nedenle, ilgili kullanıcıya ait .bashrc çağırmak kadar ayarlanmalıdır. Eski bir iş yerinde hızlı bir şekilde kavram kanıtı yapmak için bunu yapmak zorunda kaldım. Daha kalıcı bir senaryo için iğrenç bir hack olup olmayacağını bilmiyorum, ama kesinlikle işe yarıyor ve varolan senaryonuzun bir sorun olması için minimum bir değişiklik gerektiriyor. benim için çalıştı Ne

İlgili konular