2012-09-28 17 views
8

Uzak bir makinede nohup kullanarak ssh ile bir işlem başlatmak istiyorum. Sorun, nohup ile başlatılan işlemin PID'sinin nasıl elde edileceğidir, yani "işlem aslında bir şeyler yapıyor", bazı dış kabuk örneği veya benzeri değil. Ayrıca, dosyalarda stdout ve stderr depolamak istediğiniz, ama bu "Bu komutun tam PID bana yankılanır sorunsuzssh ile başlatılan bir işlemin PID'sini alın.

nohup sleep 30 > out 2> err < /dev/null & echo $! 

kullanarak çalışıyor, Yerel ... Burada

sorun değil "top" veya "ps aux | grep sleep" kullanarak da görebileceğim 30 "uyku.

Ama bunu ssh ile uzaktan yapmakta sorun yaşıyorum.

ssh remote_machine 'nohup bash -c "((sleep 30) &)" > out 2> err < /dev/null' 

gibi bir şey denedim ama "echo $!" Nereye yerleştirileceğini anlayamıyorum böylece yerel kabuğumda görüntülenir. Bana her zaman "bash" örneğinden biri olan yanlış PID'leri gösterir.

Birisi bunun nasıl çözüleceğine dair bir fikriniz mi var?

DÜZENLEME: Tamam, "bash -c" burada gerekli olmayabilir. Lotharyx işaret gibi, ben sağ PID gayet
ssh remote 'nohup sleep 30 > out 2> err < /dev/null & echo $!' 

ama sonra sorun sen üreten bir şeyle "uyku 30" yerine ise çıkış, diyelim ki, "Merhaba Dünya yankı!" Diye, o çıkışını kullanarak almak Ne yerel ne de uzak taraftaki dosyada "dışarı" kalmaz. Neden olduğu hakkında bir fikri olan var mı?

EDIT2: Benim hatam! Diğer cihazda hiç boşluk kalmadı, bu yüzden "dışarı" ve "err" dosyaları boş kaldı!

Yani bu çalışıyor. (;) Bir noktalı virgül ile ayrılmış, arka arkaya birden çok komutu çağırır istiyorsa, buna ek olarak, bir hala çok gibi, "deneme-c" kullanabilir:

ssh remote 'nohup bash -c "echo bla;sleep 30;echo blupp" > out 2> err < /dev/null & echo $!' 

Sonra PID yazdırır Yerel tarafta "bash -c", ki bu da gayet iyi. ("En içteki" veya "meşgul" sürecinin PID'sini elde etmek imkansızdır, çünkü her programın kendisi yeni alt süreçler oluşturabilir, öğrenmenin bir yolu yoktur ...)

cevap

8

Aşağıdakileri denedim (yerel

uzak makinede
 
    ~# ssh [email protected] 'nohup sleep 30 > out 2> err < /dev/null & echo $!' 
    [email protected]'s password: 
    14193 
    ~# 

, ben ps -e yoktu ve bu çizgiyi gördüm:

 
    14193 ?  00:00:00 sleep 
uzak makine) CentOS olduğunu ve seni bekliyoruz düşünüyorum tam olarak çalıştı; makine Debian olduğunu

Açıkçası, yerel makinemde, çıkış uzak makinede çalışan "uyku" PID'sidir.

Bir SSH tüneli üzerinden gönderirken komutunuza neden bash ekliyorsunuz?

+0

Hmm, haklısınız, ancak yine de stdout ile ilgili bir sorun var gibi görünüyor. Örneğin, "echo Hello World!" Gibi çıktı üreten bir şeyle "uykuyu 30" değiştirirsem, dosyada "out" yazmaz, ancak PID gibi bana döndürülür. –

+0

Sanırım "bash -c" yi ekledim çünkü "echo foo; uyku 30; echo bar" gibi bir satırda birden çok komut yürütmek istedim. –

+0

Benim hatam, çözümünüz kesinlikle çalışıyor! –

İlgili konular