Как запустить не более n параллельных подоболочек

Да, необходимо ожидать, пока та ошибка не исправлена :)

3
31.07.2015, 18:21
6 ответов

Я не могу ответить, почему PBI не был успешным, но я могу ответить, почему общие библиотеки предпочтительны в Linux.

Основным аргументом является безопасность, заключающаяся в том, что при наличии уязвимости в широко используемой библиотеке необходимо обновлять только эту библиотеку, а не все приложения, использующие эту библиотеку (благодаря совместимости с ABI). Это также означает, что (если вы придерживаетесь в основном основных репо и PPA (в случае Ubuntu)), вы не должны иметь 4 различные версии библиотеки только потому, что ваши приложения были скомпилированы по этим версиям (например, Windows, где могут быть установлены различные версии библиотек .NET или различные версии среды выполнения Visual C++).

При этом могут быть некоторые случаи, когда приложения не вынуждены использовать системную версию библиотек и вместо этого могут использовать свою собственную версию. Например, Chromium зависит от многих библиотек, которые присутствуют в большинстве репо distro. При обычных обстоятельствах приложения компилируются так, чтобы используемые ими библиотеки были теми, которые компилируются дистрибутивом. Однако в Ubuntu (по крайней мере) Chromium компилируется с собственной версией библиотек, поскольку:

  • Использование системной версии библиотек означает, что Chromium придется тестировать для каждого выпуска Ubuntu.
  • По большей части Chromium уже использует новейшие версии библиотек, что означает, что вероятность быть уязвимости значительно ниже.

Что касается аргумента дискового пространства, вы можете утверждать, что установка debootstrap 'ed версии Debian Jessie требует менее 1 ГБ дискового пространства, что делает его отличным для небольших SD-карт. С другой стороны, Windows требует не менее нескольких гигабайт дискового пространства.

Что касается старого программного обеспечения, вы можете компилировать приложение статически и иметь большинство зависимостей. Однако, поскольку в вашем дистрибутиве могут отсутствовать статические версии библиотек (Debian и Ubuntu, по большей части, нет), вам потребуется самостоятельно скомпилировать эти библиотеки, чтобы получить статические версии этих библиотек.

Наконец, один из принципов Unix заключается в том, что каждое приложение делает только одну вещь и хорошо в этом справляется. Если приложения и библиотеки были статически связаны, то их можно считать (косвенно) делающими многие вещи.

-121--72370-

Попробуйте:

sudo rm /var/lib/apt/lists/* -vf
sudo apt-get clean
sudo apt-get update
sudo apt-get install python-matplotlib
-121--243751-

Похоже, вам нужен IPC. Вместо того, чтобы закольцовывать сон и делать тест каждый раз, вы можете просто ждать, когда процесс ребенка покажет, когда он будет выполнен. Вот для чего нужны трубы.

Дочерние процессы могут быть подотчетны родительскому объекту. Откройте трубу и разделите ее с ними. Когда они закончат, они просто должны сообщить родителям.

sub()(  trap "echo >&9" 0
        sleep 5
)
eval    "exec 9<>"<(echo);i=0
until   [ "$((i+=1))" -gt 5 ]
do      sub & read na <&9
        date +%S:%t"$i"
done

Я открываю его с помощью замены процесса. Если это невозможно сделать в оболочке, можно использовать вместо этого:

mkfifo pipe; exec 9<>pipe; rm pipe; echo >&9

Теперь начальное эхо помещает одну линию в трубу - в обоих случаях.Это дает вам один процесс ожидания с самого начала - это означает, что вы будете запускать два параллельных процесса все время. Этот сценарий использует date для отчета о секундах между каждым вызовом sub () . Вот результат:

34: 1
39: 2
39: 3
44: 4
44: 5

Вот. Теперь, как вы видите, каждые 5 секунд ребенок умирает и когда он делает это эхо линия к трубе, которая чтение в настоящее время блокируется. Как только read find будет новой строкой на входе, он может выйти из того, что делает, и начать сначала.

Вам просто нужно поместить ловушку в ваш script_044, которая дает указание дочерним процессам позвонить отцу, когда они закончат.

1
27.01.2020, 21:12

(Конвенция - .txt - это просто текстовые файлы. .sh файлы - это файлы скриптов оболочки.).

Ваш скрипт mainscript.txt имеет состояние гонки. В частности, цикл while начинает свою следующую итерацию перед тем, как скрипт script044.txt сможет создать временный файл. Фактически весь цикл проходит итерацию перед созданием любого из этих файлов.

Более надежным способом решения этой проблемы является забыть временные файлы и использовать оболочку builtin wait вместо:

#!/bin/bash

pid_count=0
for counter in $(seq 1 5)
do
    xterm -e "bash script044.txt" &
    if (( ++pid_count > 2 )); then
        wait -n
        ((pid_count--))
    fi
done

Это увеличивает счетчик каждый раз при запуске подпроцесса. Если счетчик больше 3, то мы ждем завершения следующего подпроцесса. Когда возвращается wait, то мы уменьшаем счетчик и снова обходим вокруг, чтобы запустить следующий подпроцесс.

Вы можете удалить из скрипта044.txt все строки, связанные с tempfilename- они больше не нужны.


Как указывает @chepner, необходимая опция -n доступна только в bash 4.3 или более поздней версии.

3
27.01.2020, 21:12

Хотя это не поможет, если вы стремитесь к решению, основанному только на оболочке, GNU parallel предоставляет команду sem , которая может помочь именно в этой ситуации.

Следующее (не проверено, так как у меня нет вашего скрипта) должно запускать ваше задание 5 раз, но только 2 за раз, ожидая выхода в конце:

LIMIT=2
for i in {1..5}; do
    sem -j $LIMIT 'term -e "bash script044.txt"'
done
sem --wait
2
27.01.2020, 21:12

Общий способ добиться этого - использовать xargs.

printf "%s\n" {1..5} | xargs -P2 -n1 -i xterm -e '/bin/echo Job {}; bash'

printf используется только для заполнения xargs значениями. По умолчанию для xargs replace-str используется значение {}, если используется флаг -i. Пожалуйста, прочтите справочную страницу xargs, чтобы получить более подробную информацию. Это должно работать с инструментами GNU и bash как оболочкой.

xargs flags: 
-P     Run up to max-procs processes at a time.[…]
-n     Use  at most max-args arguments per command line.[…]
-i/-I  Replace occurrences of replace-str in the initial-arguments with names read from standard input.[…]
1
27.01.2020, 21:12

Вставьте некоторую задержку сразу после запуска нового экземпляра xterm ...

        xterm -e "bash script044.txt" &
        sleep 0.1
0
27.01.2020, 21:12

При использовании GNU Parallel это выглядит следующим образом:

seq 1 5 | parallel -j2 -N0 'xterm -e "bash script044.txt"'

GNU Parallel - это общий распараллеливатель, который позволяет легко запускать задания параллельно на одной машине или на несколько машин, к которым у вас есть доступ по ssh. Часто может заменить цикл на .

Если у вас есть 32 различных задания, которые вы хотите запустить на 4 процессорах, простой способ распараллеливания - запустить 8 заданий на каждом процессоре:

Simple scheduling

GNU Parallel вместо этого порождает новый процесс, когда один из них завершается, - поддерживая активность процессоров. и, таким образом, экономия времени:

GNU Parallel scheduling

Установка

Если GNU Parallel не упакован для вашего дистрибутива, вы можете выполнить персональную установку, для которой не требуется root-доступ. Это можно сделать за 10 секунд, выполнив следующие действия:

(wget -O - pi.dk/3 || curl pi.dk/3/ || fetch -o - http://pi.dk/3) | bash

Другие варианты установки см. http://git.savannah.gnu.org/cgit/parallel.git/tree/README

Подробнее

] См. Другие примеры: http://www.gnu.org/software/parallel/man.html

Посмотрите вступительные видеоролики: https://www.youtube.com/playlist?list= PL284C9FF2488BC6D1

Ознакомьтесь с руководством: http://www.gnu.org/software/parallel/parallel_tutorial.html

Подпишитесь на список адресов электронной почты, чтобы получить поддержку: https: // lists .gnu.org / mailman / listinfo / parallel

0
27.01.2020, 21:12

Теги

Похожие вопросы