GNU/Linux >> Belajar Linux >  >> Linux

Ssh Menyebabkan Loop Berhenti?

Saya akhirnya berhasil menyelesaikan masalah yang telah saya perjuangkan selama beberapa minggu. Saya menggunakan SSH dengan "kunci resmi" untuk menjalankan perintah dari jarak jauh. Semuanya baik-baik saja kecuali ketika saya melakukannya dalam loop sementara. Loop berakhir setelah menyelesaikan setiap iterasi dengan perintah ssh.

Untuk waktu yang lama saya pikir ini adalah semacam keanehan ksh, tetapi sekarang saya menemukan bash ternyata berperilaku identik.

Sebuah program sampel kecil untuk mereproduksi masalah. Ini disaring dari implementasi yang lebih besar yang mengambil snapshot dan mereplikasinya di antara node dalam sebuah cluster.

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

(Perhatikan ada karakter TAB dalam ekspresi pencarian grep sesuai dengan definisi perilaku opsi zfs list “-H”.)

Sampel saya memiliki beberapa sistem file ZFS untuk root di mana semua "zona" memiliki sistem file root pada dataset bernama mirip dengan

POOL/zones/app1zone
POOL/zones/group2/app2zone

dll.

Perulangan di atas harus membuat snapshot untuk setiap kumpulan data yang dipilih, tetapi sebagai gantinya loop ini hanya beroperasi pada yang pertama dan kemudian keluar.

Bahwa program menemukan jumlah set data yang tepat dapat dengan mudah dikonfirmasi dengan memeriksa file “/tmp/actionlist” setelah skrip ada.

Jika perintah ssh digantikan oleh, misalnya, perintah gema, maka loop berulang melalui semua baris input. Atau favorit saya – tambahkan “echo” ke perintah yang menyinggung.

Jika saya menggunakan for loop sebagai gantinya maka itu juga berfungsi, tetapi karena potensi ukuran daftar kumpulan data, ini dapat menyebabkan masalah dengan panjang baris perintah maksimum yang diperluas.

Saya sekarang 99,999% yakin bahwa hanya loop dengan perintah ssh di dalamnya yang memberi saya masalah!

Perhatikan bahwa iterasi di mana perintah ssh dijalankan, selesai! Seolah-olah data yang di-pipped ke while loop tiba-tiba hilang… Jika beberapa baris input pertama tidak menjalankan perintah ssh, maka loop akan terus berlanjut hingga benar-benar menjalankan perintah SSH.

Di laptop tempat saya menguji ini, saya memiliki dua Solaris 10 VM dengan hanya sekitar dua atau tiga kumpulan data sampel, tetapi hal yang sama terjadi pada sistem SPARC besar tempat ini dimaksudkan untuk ditayangkan, dan ada banyak kumpulan data.

Terkait:Bagaimana cara mengubah cron Shell (sh ke bash)?

Jawaban yang Diterima:

SSH mungkin membaca dari input standar, menghabiskan daftar tindakan Anda. Coba alihkan input standar ssh ke /dev/null:

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

Sebagai aturan umum, saat menjalankan perintah yang dapat mengganggu input standar di bawah while read -style loop, saya suka membungkus seluruh badan loop menjadi kurung kurawal:

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

Linux
  1. Karakter Khusus '#' Dalam Perintah Perl Ssh?

  2. Oring Dengan Benar Dalam Perintah Atas Ssh?

  3. Melewati variabel dalam perintah ssh jarak jauh

  1. linux mengeksekusi perintah dari jarak jauh

  2. Bash Loop - Bagaimana cara menghentikan loop ketika saya menekan Control-C di dalam sebuah perintah?

  3. Perintah Linux untuk menunggu server SSH aktif

  1. Cara Menemukan Koneksi SSH Aktif di Linux

  2. Ingat Perintah Setengah Diketik Saat Saya Memeriksa Sesuatu?

  3. Cara menghentikan/mencegah bruteforce SSH