У меня есть скрипт 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 … то есть, по уважительным причинам, чтобы проверить, все еще ли запущен процесс с определенным именем.