Bagaimana saya menggunakan GNU Parallel untuk loop sementara ini?

12

Jadi saya memiliki loop sementara:

cat live_hosts | while read host; do \
    sortstuff.sh -a "$host" > sortedstuff-"$host"; done

Tapi ini bisa memakan waktu lama. Bagaimana saya menggunakan GNU Parallel untuk loop sementara ini?

Proletariat
sumber

Jawaban:

13

Anda tidak menggunakan loop sementara.

parallel "sortstuff.sh -a {} > sortedstuff-{}" <live_hosts

Perhatikan bahwa ini tidak akan berfungsi jika Anda memiliki jalur di live_hosts(misalnya /some/dir/file) karena akan diperluas ke sortstuff.sh -a /some/dir/file > sortedstuff-/some/dir/file(menghasilkan no such file or directory); untuk kasus-kasus tersebut gunakan {//}dan {/}(lihat gnu-parallelmanual untuk detail):

parallel "sortstuff.sh -a {} > {//}/sortedstuff-{/}" <live_hosts
don_crissti
sumber
Apakah mungkin untuk menggunakan teedengan parallelsaat meletakkan output ke sortedstuff? Jadi saya bisa melihat outputnya.
Proletariat
1
@Proletariat - Anda ingin output ke terminal juga? Ganti saja >dengan | teemisalnya perintah pertama menjadi parallel "sortstuff.sh -a {} | tee sortedstuff-{}" <live_hosts
don_crissti
3

Sebagai sekolah tua "lakukan satu hal dan lakukan dengan baik" Unix guy, saya akan memasukkan barang substitusi string ke dalam skrip pembungkus:

#!/bin/sh
sortstuff.sh -a "$1" > sortedstuff-"$1"

Jika Anda memanggilnya wrapper.sh, parallelperintah untuk memanggilnya adalah:

parallel wrapper.sh < live_hosts

Perhatikan bahwa Anda tidak perlu catuntuk hal semacam ini, yang menyimpan permintaan program eksternal.

Warren Young
sumber
2

Anda tidak perlu parallel , karena tubuh loop tidak tergantung pada iterasi sebelumnya. Mulai saja proses latar belakang baru untuk setiap host.

while read host; do
    sortstuff.sh -a "$host" > sortedstuff-"$host" &
done < live_hosts
wait    # Optional, to block until the background tasks are done

parallelmemang membuatnya lebih mudah untuk mengelola aspek-aspek tertentu; Anda dapat membatasi jumlah pekerjaan yang berjalan secara paralel dengan lebih mudah.

chepner
sumber
3
Jika wc -l live_hostslebih dari jumlah poros disk atau inti CPU - tergantung pada apakah tugasnya I / O atau terikat CPU - Anda akan memakan banyak keuntungan yang Anda dapatkan dari paralelisme dengan solusi seperti itu. Kemampuan paralleluntuk membatasi jumlah pekerjaan tidak hanya bagus, itu hampir esensial, jika kecepatan pemrosesan adalah tujuan Anda.
Warren Young