Saya memiliki skrip bash yang terlihat seperti ini:
#!/bin/bash
wget LINK1 >/dev/null 2>&1
wget LINK2 >/dev/null 2>&1
wget LINK3 >/dev/null 2>&1
wget LINK4 >/dev/null 2>&1
# ..
# ..
wget LINK4000 >/dev/null 2>&1
Tetapi memproses setiap baris sampai perintah selesai kemudian pindah ke yang berikutnya sangat memakan waktu, saya ingin memproses misalnya 20 baris sekaligus kemudian ketika mereka selesai 20 baris lagi diproses.
Saya berpikir wget LINK1 >/dev/null 2>&1 &
untuk mengirim perintah ke latar belakang dan melanjutkan, tetapi ada 4000 baris di sini ini berarti saya akan memiliki masalah kinerja, belum lagi menjadi terbatas dalam berapa banyak proses yang harus saya mulai pada saat yang sama sehingga ini bukan yang baik ide.
Salah satu solusi yang saya pikirkan saat ini adalah memeriksa apakah salah satu perintah masih berjalan atau tidak, misalnya setelah 20 baris saya dapat menambahkan loop ini:
while [ $(ps -ef | grep KEYWORD | grep -v grep | wc -l) -gt 0 ]; do
sleep 1
done
Tentu saja dalam hal ini saya harus menambahkan & ke akhir baris! Tapi saya merasa ini bukan cara yang tepat untuk melakukannya.
Jadi bagaimana saya benar-benar mengelompokkan masing-masing 20 baris bersama dan menunggu mereka untuk menyelesaikan sebelum pergi ke 20 baris berikutnya, skrip ini dihasilkan secara dinamis sehingga saya dapat melakukan matematika apa pun yang saya inginkan saat itu sedang dihasilkan, tetapi TIDAK TIDAK harus gunakan wget, itu hanya contoh jadi solusi apa pun yang spesifik wget tidak akan ada gunanya bagiku.
wait
adalah jawaban yang tepat di sini, tetapi jawaban Andawhile [ $(ps …
akan jauh lebih baikwhile pkill -0 $KEYWORD…
- menggunakan proctools ... yaitu, untuk alasan yang sah untuk memeriksa apakah suatu proses dengan nama tertentu masih berjalan.Jawaban:
Gunakan
wait
bawaan:Untuk contoh di atas, 4 proses
process1
...process4
akan dimulai di latar belakang, dan shell akan menunggu sampai selesai sebelum memulai set berikutnya.Dari manual GNU :
sumber
i=0; waitevery=4; for link in "${links[@]}"; do wget "$link" & (( i++%waitevery==0 )) && wait; done >/dev/null 2>&1
Lihat paralel . Sintaksnya mirip dengan
xargs
, tetapi menjalankan perintah secara paralel.sumber
wait
, karena menangani memulai pekerjaan baru sebagai yang lama selesai, daripada menunggu seluruh batch selesai sebelum memulai yang berikutnya.cat list_of_links.txt | parallel -j 4 wget {}
yang akan membuat empatwget
s berjalan pada satu waktu.parallel
.parallel --jobs 4 < list_of_commands.sh
, di mana list_of_commands.sh adalah file dengan satu perintah (mis.wget LINK1
, catatan tanpa&
) pada setiap baris. Mungkin perlu dilakukanCTRL+Z
danbg
setelah dibiarkan berjalan di latar belakang.Bahkan,
xargs
bisa menjalankan perintah secara paralel untuk Anda. Ada-P max_procs
opsi baris perintah khusus untuk itu. Lihatman xargs
.sumber
Anda dapat menjalankan 20 proses dan menggunakan perintah:
Script Anda akan menunggu dan melanjutkan ketika semua pekerjaan latar belakang Anda selesai.
sumber