SSH, döngünün durmasına neden olur


30

Sonunda birkaç hafta boyunca uğraştığım bir sorunu çözmeyi başardım. Uzaktan komutları çalıştırmak için SSH'yi "yetkili anahtarlarla" kullanıyorum. Bir süre döngü içinde yaptığım zamanlar hariç her şey yolunda. Döngü ssh komutuyla herhangi bir yineleme tamamlandıktan sonra sona erer.

Uzun zamandır bunun bir tür gariplik olduğunu düşündüm, ama şimdi bash'ın aslında aynı şekilde davrandığını keşfettim.

Sorunu yeniden oluşturmak için küçük bir örnek program. Bu, anlık görüntüleri alan ve kümedeki düğümler arasında çoğaltan daha büyük bir uygulamadan damıtılır.

#!/bin/bash

set -x

IDTAG=".*zone"
MARKER="mark-$(date +%Y.%m.%d.%H.%M.%S)"
REMOTE_HOST=sol10-target
ZFSPARENT=rpool

ssh $REMOTE_HOST zfs list -t filesystem -rHo name,mounted $ZFSPARENT | grep "/$IDTAG    " > /tmp/actionlist

#for RMT_FILESYSTEM in $(cat /tmp/actionlist)
cat /tmp/actionlist | while read RMT_FILESYSTEM ISMOUNTED
do
   echo ${RMT_FILESYSTEM}@${MARKER}
   [ "$ISMOUNTED" = "yes" ] && ssh $REMOTE_HOST zfs snapshot -r ${RMT_FILESYSTEM}@${MARKER}
   echo Remote Command Return Code: $?
done

(Grep search ifadesinde "-H" seçeneğinin zfs listesinin davranış tanımına göre bir TAB karakteri olduğuna dikkat edin.)

Örnekte, tüm "bölgelerin" kök dosya sistemine benzer bir veri kümesinde sahip olduğu kök için bazı ZFS dosya sistemleri var.

HAVUZ / bölgeler / app1zone
POOL / bölgeler / grup2 / app2zone

vb.

Yukarıdaki döngü, seçilen veri kümelerinin her biri için bir anlık görüntü oluşturmalıdır, ancak bunun yerine yalnızca ilkinde çalışır ve sonra çıkar.

Programın doğru sayıda veri kümesini bulduğunu belirten komut dosyası bulunduktan sonra "/ tmp / actionlist" dosyasını kontrol ederek kolayca onaylanabilir.

Ssh komutu, örneğin bir yankı komutu ile değiştirilirse, döngü tüm giriş satırlarında yinelenir. Ya da favorim - rahatsız edici komuta "echo" yu hazırlayın.

Yerinde bir for döngüsü kullanırsam o zaman da çalışır, ancak veri kümesi listesinin potansiyel büyüklüğü nedeniyle bu, maksimum genişletilmiş komut satırı uzunluğunda sorunlara neden olabilir.

Şimdi% 99,999, yalnızca ssh komutları olan döngülerin bana sorun çıkardığından eminim!

Ssh komutunun çalıştığı yinelemenin tamamlandığını unutmayın! Bu süre döngüsüne gönderilen veriler aniden kayboluyormuş gibi ... İlk birkaç giriş satırı bir ssh komutu yapmazsa, döngü aslında SSH komutunu çalıştırana kadar devam eder.

Bunu test ettiğim dizüstü bilgisayarımda yalnızca iki ya da üç örnek veri setine sahip iki Solaris 10 VM'm var, ancak aynı şey bunun yayınlanması gereken büyük SPARC sistemlerinde de oluyor ve birçok veri seti de var.


7
SSH, yemeklerinizi standart girdiden okuyor olabilir actionlist. /dev/null
Ssh'nin

Onu deneyeceğim. Bir paketleyiciye ssh koymanın işe yaramadığını eklemek istiyorum ....
Johan

Haklısın. Bunu nasıl göremedim !?
Johan

@BatchyX Yorumunuzun bir cevap olarak nitelendirildiğini düşünüyorum.
CVn

Cevabı "kabul etmek" istediğimde, @BatchyX'in bunu tekrarlayacağı şekilde tekrar göndermesi konusunda hemfikirim.
Johan

Yanıtlar:


43

SSH standart listeden okuma yapıyor, eylem listenizi yiyor olabilir. Ssh'nin standart girişini / dev / null konumuna yönlendirmeyi deneyin:

ssh $REMOTE_HOST zfs snapshot -r ${RMT_FILESYSTEM}@${MARKER} </dev/null

Genel bir kural olarak, bir while readstil döngüsünde standart girişe müdahale edebilecek komutları çalıştırırken , tüm döngü gövdesini parantez içine sarmayı seviyorum:

cat /tmp/uuoc | while read RMT_FILESYSTEM ISMOUNTED
do {
    echo ${RMT_FILESYSTEM}@${MARKER}
    [ "$ISMOUNTED" = "yes" ] && ssh $REMOTE_HOST zfs snapshot -r ${RMT_FILESYSTEM}@${MARKER}
    echo Remote Command Return Code: $?
} < /dev/null; done

3
İlk olarak 20 yıl boyunca hiç rastlamadığım (en azından hatırlayamadığım) kriptoların özel kullanımı için çifte harika (en azından hatırlayamadığım). FWIW (ve kendi savunmamda) Bazen bir istisna yapıyorum ve okunabilirlik adına fazladan kedi ifadeleri ekliyorum! Bu forumu çok seviyorum, çünkü aniden tekrar yeni şeyler öğreniyorum! Özellikle, bu durumda olduğu gibi satırların başlangıcına yönlendirmeler eklemeyi seviyorum, ancak konuyu şaşırtmış gibi görünen forumlarda daha az yararlı yanıt almamı sağlıyor!
Johan

{...} ve (...) ksh man page diyor ki {...} arasındaki farkları çözmeye çalışıyorum, sadece komut satırının başında tanınan özel anahtar kelimeler. Ama başka bir fark daha var ... ( </tmp/file [ -z "$SOMEVAR" ] && awk '{print "X", $0}' )aynı kaşlı ayraçlar ile aynı. Üretilen çıktılar açısından, kapanış kaşlı ayracın yeni bir çizgide olması gerektiği gerçeğiyle ilgili değil ...
Johan

5
Ayrıca, OpenSSH'nin ssh'ı-n stdin'i / dev / null'dan yeniden açılmasını sağlayan (etkin) bir seçeneğe sahiptir .
Chris Johnsen,

sudoDöngü içinde komut ile kullanmak için herhangi bir geçici çözüm ?
bonh

Eskiden beri bir yerde -n kullanırdım ve bir noktada alışkanlığımı kaybettim .... ve şimdi yine neden yaptığımı biliyorum, bir süre sonra kazmaya devam ediyor ...
Florian Heigl
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.