Cara menggunakan "progress-bar.sh" untuk menampilkan kemajuan operasi yang terjadi pada server jarak jauh

-1

Saya perlu mengintegrasikan progress bar untuk operasi di server jauh melalui SSH.

Dalam situasi saya ada beberapa loop yang memicu proses pada beberapa server jauh melalui SSH. Proses-proses ini dipicu dengan certainFunctiondan memakan waktu antara 10 hingga 60 menit (tergantung pada banyak hal yang tidak terduga). Sejauh proses dikendalikan dari server utama, saya ingin menampilkan beberapa progress bar berdasarkan waktu, seperti persentase atau bar (BUKAN titik atau pemintal), yang akan menunjukkan kemajuan secara keseluruhan.

Apakah ini mungkin?

Mencari beberapa solusi boros, saya menemukan proyek Édouard Lopezprogress-bar.sh cocok untuk kebutuhan saya.

Ini adalah kode untuk progress-bar.sh:

progress-bar() {
  local duration=${1}


    already_done() { for ((done=0; done<$elapsed; done++)); do printf "▇"; done }
    remaining() { for ((remain=$elapsed; remain<$duration; remain++)); do printf " "; done }
    percentage() { printf "| %s%%" $(( (($elapsed)*100)/($duration)*100/100 )); }
    clean_line() { printf "\r"; }

  for (( elapsed=1; elapsed<=$duration; elapsed++ )); do
      already_done; remaining; percentage
      sleep 1
      clean_line
  done
  clean_line
}

Bisakah itu digunakan untuk situasi saya? Saya mencari solusi Bash murni tanpa paket tambahan yang diinstal.

tidak berwajah
sumber
2
Jadi, Anda ingin memiliki bilah kemajuan keseluruhan berdasarkan waktu untuk hal-hal yang membutuhkan waktu antara 10 hingga 60 menit tergantung pada banyak hal yang tidak dapat diprediksi , bukan? Apakah satu proses (sebagai entitas terpisah) mengetahui perkiraan waktu lamanya atau progresnya atau apa pun saat berjalan? dan dapatkah ini melaporkannya kepada Anda? Jika tidak, saya khawatir Anda perlu paranormal untuk menebaknya $duration; terutama ketika ada banyak hal yang tidak terduga. Mungkin indikator kemajuan terbaik yang dapat Anda miliki adalah seperti "N tugas M selesai".
Kamil Maciorowski
N of M terdengar sangat bagus! Bagaimana saya bisa mencapai ini? Saya tahu jumlah elemen dalam array, dan menangkap peristiwa menyelesaikan proses.
berwajah
Apa tepatnya perintah yang Anda jalankan secara lokal untuk memicu tugas jarak jauh ini?
Kamil Maciorowski
Semua perintah (rsync, ssh, exec ...) digabungkan menjadi satu 'fungsi' yang dipicu oleh loop 'for' (mengambil IP dari array) dengan 'tunggu' pada akhirnya. Jadi saat ini hanya ada cetak terakhir di pembuluh darah "Upgrade simultan meluncurkan", dan waktu kemudian hanya membosankan tunggu
berwajah
Dapatkan jumlah IP dari array Anda dan beri makan fungsi Anda: progress-bar ${#arrayOfIPaddresses[@]}dan alih-alih sleepperintah, jalankan kode Anda yang sebenarnya
Alex

Jawaban:

0

Menulis progress bar itu mudah; itu bukan masalahmu. Anda bisa menggunakannya

declare -i progress
progress=1
declare -i width
width=$(tput cols)-10
declare -i pbarlength


prt_bar(){
    pbarlength=$((width*progress/100))
    echo -en "\r"
    for i in `seq $pbarlength` ; do
        echo -n '='
    done
    echo -en " $progress   "

}

atau semacam itu

Masalah utama adalah menentukan apa kemajuan Anda. Jika Anda mencoba melakukannya berdasarkan waktu, Anda pasti akan mendapatkan perasaan keliru tentang kemajuan, karena prosesnya (saya kutip): memakan waktu antara 10 hingga 60 menit (tergantung pada banyak hal yang tidak dapat diprediksi).

Jika hanya berdasarkan waktu, Anda dapat menggunakan:

while [ $progress -lt 100 ] ; do
    progress=$((progress+1))
    prt_bar
    sleep 10
done
echo 
echo done

Tetapi jika Anda tidak memiliki ukuran bagaimana proses mengalami kemajuan, dan Anda tidak mampu memberikan estimasi realistis dari kemajuan yang sebenarnya, tidak ada gunanya menyediakan progress bar. Widget jam window manager favorit Anda akan menyediakan sebanyak mungkin informasi yang relevan.

Ljm Dullaart
sumber