Bir işlemi uzaktan başlatmak için SSH'yi kullanma


18

Kontrolüm altındaki birkaç makineye yeni bir hizmet göndermek ve dağıtmak için kullandığım bir komut dosyası yazdım ve işlemi yürütmek için işlemi uzaktan başlatmak için ssh kullanıyorum. Ne yazık ki, işlemi başlatmak için SSH'yi her kullandığımda, SSH komutu hiçbir zaman geri dönmez ve betiğin durmasına neden olur.

Komut şu şekilde belirtilir: ssh $ user @ $ host "/ root / command &". Ne zaman ps veya kim gibi basit komutları çalıştırsam, SSH komutu hemen geri döner, ancak işlemimi başlattığımda geri dönmez. Ben süreci başlatır ve sonra çıkar basit bir bash komut dosyası içinde benim işlem sarma gibi hileler denedim, ancak bu da SSH komutunu askıda kalıyor (bash komut dosyası bir başarı iletisi yankılar ve normal olarak çıkar).

Herkes bu davranışa neyin neden olduğu ve SSH komutunun işlem başlar başlamaz geri dönmesini nasıl sağlayabilirim?

Görüşleriniz için teşekkürler!


Tam olarak kullandığınız komut satırını gönderin ... şifreleri / kullanıcı adlarını / IP'lerini atlayın
Joseph Kern

ssh $ SSH_USER @ $ HOST_ADDR "/ root /
AppName

SSH anahtarları kurduğumdan bahsetmeliyim, bu nedenle uzak sistemlerde komutları çalıştırmak için parola kullanmak gerekli değildir.
rmrobins

@rmrobins, çok iyi bir adım - ortak anahtar kimlik doğrulaması.
nik

Yanıtlar:


28

SSH uzak kabuğun stdin, stdout ve stderr'ını yerel terminalinize bağlar, böylece uzak tarafta çalışan komutla etkileşime girebilirsiniz.

Bir yan etki olarak, bu bağlantılar kapatılana kadar çalışmaya devam eder, bu yalnızca uzaktan komut ve tüm çocukları (!) Sonlandırıldığında gerçekleşir (çünkü "&" başlayan çocuklar std * üst süreç ve açık tutun).

Yani böyle bir şey kullanmalısın

ssh user@host "/script/to/run < /dev/null > /tmp/mylogfile 2>&1 &"

<,> Ve 2> & 1 stdin / stdout / stderr'i terminalinizden uzağa yönlendirir. "&" Sonra betiğinizin arka plana gitmesini sağlar. Üretimde elbette stdin / err dosyasını uygun bir günlük dosyasına yönlendirirsiniz.

Görmek

http://osdir.com/ml/network.openssh.general/2006-05/msg00017.html

Düzenle:

Sadece öğrendim < /dev/nullyukarıda gerekli değildir (ancak stdout / err yönlendirme isimli ). Neden olduğu hakkında bir fikrim yok ...


Teşekkürler, tam olarak aradığım şey buydu - ve arkaplanda başlatmak için & kullanıldığında bile işlemin std * 'yi miras alacağı bana gelmedi.
rmrobins

+1! Benim için çalışıyor. Ayrıca çıktıyı günlük dosyasına ssh user@host "/script/to/run > /tmp/ssh.stdout 2>&1 && cat /tmp/ssh.stdout && rm -f /tmp/ssh.stdout"
yansıtarak

5

Nohup'u deneyebilirsiniz . Daha fazla bilgi için man nohup.

ssh host "nohup script &"

Çıktıyı uzak makinede tutmak istiyorsanız, işte bir varyant .

ssh user@host 'export REMOTE=myname; nice nohup ./my-restart >
logfile.log 2>&1 &'

5

Başka bir alternatif, müstakil bir screen(1)şey ateşlemek olacaktır :

ssh -l user host "screen -d -m mycommand"

Bu, ayrılmış bir ekranı başlatır (içindeki tüm etkileşimi yakalar) ve hemen geri dönerek ssh oturumunu sonlandırır.

Biraz daha yaratıcılıkla, oldukça karmaşık uzaktan komut çağrılarını bu şekilde çözebilirsiniz.


4
 -f      Requests ssh to go to background just before command execution.
         This is useful if ssh is going to ask for passwords or
         passphrases, but the user wants it in the background.  This
         implies -n.  The recommended way to start X11 programs at a
         remote site is with something like ssh -f host xterm.

         If the ExitOnForwardFailure configuration option is set to “yes”,
         then a client started with -f will wait for all remote port for‐
         wards to be successfully established before placing itself in the
         background.

1
Bu yöntemin sorunu, SSH komutunun gerçekten sonlandırılmaması, basit bir şekilde arka planda gizlenmesidir, bu nedenle komut dosyasını çalıştıran ana bilgisayarda, arka planda asla geri dönmeyen çok sayıda SSH komutu olacaktır (SSH komutları asla geri dönmez) ( yani çözmek istiyorum kök sorunu)
rmrobins 15

-1

Bence doğru yol

ssh user@host exec script.sh &

Hayır, bu benim için işe yaramıyor. Neden olsun ki?
sleske

Ben arka plan itme ssh üzerinde kullanmadım, eldeki bir terim olmadan çalışıyordu. benim hatam.
nik
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.