Tôi có một tập lệnh bash trông như thế này:
#!/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
Nhưng việc xử lý từng dòng cho đến khi lệnh kết thúc rồi chuyển sang dòng tiếp theo rất tốn thời gian, tôi muốn xử lý ví dụ 20 dòng cùng một lúc sau đó khi chúng hoàn thành 20 dòng khác được xử lý.
Tôi đã nghĩ wget LINK1 >/dev/null 2>&1 &
đến việc gửi lệnh đến nền và tiếp tục, nhưng có 4000 dòng ở đây có nghĩa là tôi sẽ gặp vấn đề về hiệu năng, chưa kể bị giới hạn trong bao nhiêu quy trình tôi nên bắt đầu cùng một lúc nên điều này không tốt ý tưởng.
Một giải pháp mà tôi đang nghĩ đến bây giờ là kiểm tra xem một trong các lệnh có còn chạy hay không, ví dụ sau 20 dòng tôi có thể thêm vòng lặp này:
while [ $(ps -ef | grep KEYWORD | grep -v grep | wc -l) -gt 0 ]; do
sleep 1
done
Tất nhiên trong trường hợp này tôi sẽ cần phải nối thêm vào cuối dòng! Nhưng tôi cảm thấy đây không phải là cách đúng đắn để làm điều đó.
Vậy làm thế nào để tôi thực sự nhóm mỗi dòng 20 lại với nhau và đợi chúng kết thúc trước khi đi đến 20 dòng tiếp theo, tập lệnh này được tạo động để tôi có thể thực hiện bất kỳ phép toán nào tôi muốn trong khi nó được tạo, nhưng nó KHÔNG phải sử dụng wget, nó chỉ là một ví dụ vì vậy bất kỳ giải pháp nào cụ thể sẽ không giúp ích gì cho tôi.
wait
là câu trả lời đúng ở đây, nhưng bạnwhile [ $(ps …
sẽ viết tốt hơn nhiềuwhile pkill -0 $KEYWORD…
- sử dụng proctools , vì lý do chính đáng để kiểm tra xem một quy trình có tên cụ thể có còn chạy hay không.