shell script: chạy một loạt các lệnh N song song, đợi tất cả kết thúc, chạy N tiếp theo


9

Nhiệm vụ: chạy các khối bao gồm 3-5 lệnh (song song / nền). Khối ví dụ:

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 &

Khi xong, khối tiếp theo sẽ chạy. Tôi cho rằng, điều này có thể được thực hiện thông qua các tập tin khóa:

nhiệm vụ1.sh:

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

nhiệm vụ2.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

Một số phương pháp để kiểm tra xem thư mục có trống không có thể được tìm thấy ở đây , không chắc chắn nên sử dụng thư mục nào;

Câu hỏi : cách nào tốt hơn để thực hiện điều này?

PS Phương pháp báo cáo trạng thái có thể:

 command && report_good_state.sh taskid ;  report_state_done.sh taskid; rm /var/lock/myscript/taskN.lock

Các bạn, đừng biết phải nói gì: tất cả các câu trả lời đều đúng, cảm ơn!
kagali-san

Câu trả lời:


8

Đây chính xác là những gì gnu song song được thiết kế cho, vì vậy tôi thực sự khuyên bạn nên sử dụng nó. Cụ thể, hãy xem việc chạy nó như một 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

8

Có lẽ một số biến thể về điều này?

while true
do
  ./task1.sh&
  pid1=$!
  ./task2.sh&
  pid2=$!
  ./task3.sh&
  pid3=$!
  wait $pid1
  wait $pid2
  wait $pid3
done

Nhưng vâng, GNU song song là tốt hơn nếu có sẵn.
Eduardo Ivanec

5

Bạn có bất kỳ lý do cụ thể nào để không sử dụng một cái gì đó như GNU song song không? Nếu bạn phải sử dụng bash, thì hãy xem xét các phương pháp giống như các phương pháp được mô tả trong bài đăng trên blog này (chờ và đặt tên ống là hữu ích ở đây).


3

"Chờ" chờ tất cả các công việc nền hoàn thành. Mẫu vật:

ngủ 30 & ngủ 40 & ngủ 120 và chờ đợi

Nó chờ cho đến khi tất cả các lệnh được hoàn thành, tức là ít nhất 120 giây cho ví dụ này.

Hi vọng điêu nay co ich.


0

Chúng tôi đã thử sử dụng tiện ích sem sem , như được mô tả bởi Phil Hollenback ở trên, nhưng thấy nó quá nặng (hơn 300 trường hợp làm tê liệt máy). Tôi đã tìm kiếm các công cụ tương tự để thực hiện một semaphore đếm nhẹ nhưng không thể tìm thấy bất cứ thứ gì phù hợp.

Vì vậy, tôi đã tự mình thực hiện một đàn bằng cách sử dụng đàn, nó được gọi là semaphoric .

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.