skrip shell: jalankan batch perintah N secara paralel, tunggu semua selesai, jalankan N berikutnya

9

Tugas: menjalankan blok yang terdiri dari 3-5 perintah (secara paralel / latar belakang). Blok contoh:

dd if=/dev/urandom of=/mnt/1/x bs=1024 count=1024000000 &
dd if=/dev/urandom of=/mnt/2/x bs=1024 count=1024000000 &
dd if=/dev/urandom of=/mnt/3/x bs=1024 count=1024000000 &

Setelah selesai, blok selanjutnya harus dijalankan. Saya kira, ini bisa dilakukan melalui file kunci:

task1.sh:

real_task1 real_param1 ; rm /var/lock/myscript/task1.lock

task2.sh:

real_task2 real_param1 ; rm /var/lock/myscript/task2.lock

...

taskgen.sh:

# loop
 # while directory isn't empty - wait...
 gen_tasks.pl # build task files from some queue
 for i in 1 2 3; do touch /var/lock/myscript/task$i.lock ; done
 ./task1.sh &
 ./task2.sh &
 ./task3.sh &
 # if task1.sh doesn't exits then exit, else loop waits for files to be deleted

Sejumlah metode untuk memeriksa apakah direktori kosong dapat ditemukan di sini , jangan yakin mana yang akan digunakan;

Pertanyaan : ada cara yang lebih baik untuk mengimplementasikan ini?

PS Metode pelaporan status yang memungkinkan:

 command && report_good_state.sh taskid ;  report_state_done.sh taskid; rm /var/lock/myscript/taskN.lock
kagali-san
sumber
Kawan, hanya tidak tahu harus berkata apa: semua jawaban sudah benar, terima kasih!
kagali-san

Jawaban:

8

Ini adalah persis apa gnu parallel dirancang untuk, jadi saya sangat menyarankan Anda menggunakannya. Secara khusus, lihat menjalankannya sebagai semaphore :

for i in {1..4}
do
  echo running $i
  sem -j3 df dd if=/dev/urandom of=/mnt/$i/x bs=1024 count=1024000000 ";" echo done
done
# sem --wait waits until all jobs are done.
sem --wait
Phil Hollenback
sumber
8

Mungkin beberapa variasi dalam hal ini?

while true
do
  ./task1.sh&
  pid1=$!
  ./task2.sh&
  pid2=$!
  ./task3.sh&
  pid3=$!
  wait $pid1
  wait $pid2
  wait $pid3
done
Eduardo Ivanec
sumber
Tapi ya, paralel GNU lebih baik jika tersedia.
Eduardo Ivanec
5

Apakah Anda punya alasan khusus untuk tidak menggunakan sesuatu seperti GNU parallel ? Jika Anda harus menggunakan bash, maka pertimbangkan metode seperti yang dijelaskan dalam posting blog ini (tunggu dan beri nama pipa sangat membantu di sini).

justarobert
sumber
3

"tunggu" menunggu semua pekerjaan latar belakang selesai. Sampel:

tidur 30 & tidur 40 & tidur 120 & tunggu

Itu menunggu sampai semua perintah selesai, yaitu setidaknya 120 detik untuk contoh ini.

Semoga ini membantu.

Harri
sumber
0

Kami mencoba menggunakan utilitas sem GNU , seperti yang dijelaskan oleh Phil Hollenback di atas, tetapi ternyata terlalu berat (300+ contoh melumpuhkan mesin). Saya mencari-cari alat serupa untuk menerapkan semaphore penghitungan ringan tetapi tidak dapat menemukan sesuatu yang cocok.

Jadi saya menerapkannya sendiri menggunakan kawanan, itu disebut semaphoric .

Tim Bunce
sumber