Melacak kemajuan dengan xargs

11

Saya menggunakan xargs untuk menjalankan perintah pada set parameter input, seperti ini:

cat <someinput> | xargs -n 1 -P 5 <somecmd>

File input sangat panjang dan membutuhkan waktu lama untuk dijalankan. Jadi saya hanya menunggu command prompt muncul. Apakah ada cara untuk menampilkan bilah progres untuk jumlah argumen input yang telah selesai?

Saya mencoba menggunakan 'bar' tetapi saya selalu mendapat 'infinite'. Sepertinya xargs membaca seluruh input sebelum menjalankan perintah.

http://i.stack.imgur.com/5Wsgx.gif

Utkarsh Sinha
sumber

Jawaban:

13

Jika Anda memiliki GNU Parallel Anda dapat menjalankan:

cat <someinput> | parallel --bar -P 5 <somecmd>

GNU Parallel adalah parallelizer umum dan membuatnya mudah untuk menjalankan pekerjaan secara paralel pada mesin yang sama atau pada beberapa mesin yang Anda miliki akses ssh.

Jika Anda memiliki 32 pekerjaan berbeda yang ingin Anda jalankan pada 4 CPU, cara langsung untuk memparalelkan adalah menjalankan 8 pekerjaan pada setiap CPU:

Penjadwalan sederhana

GNU Paralel sebagai gantinya memunculkan proses baru ketika proses selesai - menjaga CPU tetap aktif dan dengan demikian menghemat waktu:

Penjadwalan Paralel GNU

Instalasi

Instalasi pribadi tidak memerlukan akses root. Ini dapat dilakukan dalam 10 detik dengan melakukan ini:

(wget -O - pi.dk/3 || curl pi.dk/3/ || fetch -o - http://pi.dk/3) | bash

Untuk opsi instalasi lain, lihat http://git.savannah.gnu.org/cgit/parallel.git/tree/README

Belajarlah lagi

Lihat lebih banyak contoh: http://www.gnu.org/software/parallel/man.html

Tonton video intro: https://www.youtube.com/playlist?list=PL284C9FF2488BC6D1

Ikuti tutorialnya: http://www.gnu.org/software/parallel/parallel_tutorial.html

Mendaftar untuk daftar email untuk mendapatkan dukungan: https://lists.gnu.org/mailman/listinfo/parallel

Ole Tange
sumber
1
terima kasih banyak (atas jawabannya, dan untuk menulis perangkat lunak!), ini bekerja dengan baik!
Greg Sadetsky
9

Anda dapat menggunakan pv:

cat <someinput> | pv -p -s sizeof_someimput | xargs -n 1 -P 5 <somecmd>

Dengan ini Anda akan tahu di mana pembacaan someimput berada, sehingga Anda akan tahu kira-kira di mana perawatan someimput berada.

DrGkill
sumber
1
FIND=( find "$DIR" -type f ) && ${FIND[@]} -print0 | pv -0lps $(${FIND[@]} | wc -l) | xargs -0 -I {} -P 5 <somecmd>
Kasing
3

Jika Anda hanya mencari indikasi umum tentang kemajuan, metode paling sederhana adalah dengan hanya mengulang sebelum melakukan perintah yang ingin Anda lakukan.

Contoh: cat <someinput> | xargs -I{} sh -c 'echo {}; <somecmd>;'

-I{}set {}ke string saat ini sedang diproses

sh -cakan memungkinkan Anda untuk menjalankan beberapa perintah (catatan: semi-kolon setelah setiap perintah diperlukan termasuk yang terakhir .

Zaheer
sumber