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.
actionlist
./dev/null