У мене є сценарій bash, який виглядає приблизно так:
#!/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
Але обробка кожного рядка до тих пір, поки команда не буде закінчена, а потім перехід до наступного дуже трудомісткий, я хочу обробити, наприклад, 20 рядків одразу, потім, коли вони закінчені, ще 20 рядків обробляються.
Я думав над тим, wget LINK1 >/dev/null 2>&1 &
щоб відправити команду на другий план і продовжувати, але тут є 4000 рядків, це означає, що у мене виникнуть проблеми з продуктивністю, не кажучи вже про обмеження в тому, скільки процесів я повинен запустити одночасно, так що це не добре ідея.
Одне рішення, про яке я зараз думаю, - це перевірити, чи працює одна з команд чи ні, наприклад, через 20 рядків я можу додати цю петлю:
while [ $(ps -ef | grep KEYWORD | grep -v grep | wc -l) -gt 0 ]; do
sleep 1
done
Звичайно, у цьому випадку мені потрібно буде додати & до кінця рядка! Але я відчуваю, що це не правильний спосіб зробити це.
Отже, як я насправді групую кожні 20 рядків разом і чекаю, коли вони закінчать, перш ніж перейти до наступних 20 рядків, цей сценарій динамічно генерується, щоб я міг робити все, що я хочу на ньому, поки він генерується, але це НЕ потрібно Використовуйте wget, це був лише приклад, тому будь-яке рішення, яке є специфічним для wget, не принесе мені користі.
wait
тут є правильною відповіддю, але вамwhile [ $(ps …
було б набагато краще писатиwhile pkill -0 $KEYWORD…
- використовуючи proctools ... тобто з законних причин перевірити, чи не працює процес із певним іменем.