коммуникация между несколькими процессами

Попытайтесь использовать ограничивающие настройки ресурса ImageMagick: convert -limit memory 1G ... Это ограничит использование памяти 1G при выполнении.

Для наблюдения что текущие доступные ресурсы работайте: convert -list resource

13
27.05.2014, 01:38
2 ответа
[1181478] Термин для того, что вы пытаетесь достичь, это [1181883] мультиплексирование [1181884].

Это может быть достигнуто довольно легко на баше, но это требует некоторых более продвинутых басовых возможностей.

Я создал сценарий на основе твоего, который, как мне кажется, делает то, что ты пытаешься сделать. Я объясню это ниже.

manager[1181886] - это функция bash, которая просто читает из STDIN и записывает свой идентификатор и строку в STDOUT. Мы используем [1181887]$BASHPID[1181888] вместо [1181889]$$[1181890], так как [1181891]$$[1181892] не обновляется для подоболочек (именно это мы будем использовать для запуска [1181893]manager[1181894].

fds[1181896] - это массив, в котором будут храниться файловые дескрипторы, указывающие на трубы STDIN различных [1181897] manager[1181898] порожденных.[1181899]. Затем мы проходим по циклу и создаем 5 процессов менеджера. Я использую синтаксис [1181900] для (( ))[1181901] вместо того, как вы это делали, так как он чище. Это специфично для бэша, но некоторые из вещей, которые делает этот скрипт, специфичны для бэша, так что, может быть, все же пойдет до конца.[1181902].  

Далее переходим к [1181903]exec {fd}>>(manager $i)[1181904]. Это делает еще несколько бэш-специфических вещей. [1181905] Первым из них является [1181906]{fd}>[1181907]. При этом захватывается следующий доступный дескриптор файла под номером 10 или после него, открывается трубка с записывающей стороной трубки, назначенной этому дескриптору файла, и присваивается номер дескриптора файла переменной [1181908]$fd[1181909].

[1181910]>(manager $i)[1181911] запускает [1181912] manager $i[1181913] и в основном заменяет [1181914]>(manager $i)[1181915] на путь к STDIN этого процесса. Таким образом, если [1181916]-менеджер [1181917] был запущен как PID 1234, то [1181918]>(manager $i)[1181919] может быть заменен на [1181920]/proc/1234/fd/0[1181921] (это зависит от ОС).

Таким образом, если предположить, что следующий доступный номер дескриптора файла - 10, а менеджер запущен с PID 1234, команда [1181922]exec {fd}> >(manager $i)[1181923] в основном становится [1181924]exec 10>/proc/1234/fd/0[1181925], и у bash теперь есть файловый дескриптор, указывающий на STDIN этого менеджера.[1181926]. Затем, так как bash помещает номер дескриптора этого файла в [1181927]$fd[1181928], мы добавляем этот дескриптор в массив [1181929]fds[1181930] для дальнейшего использования.[1181931].  

Остальное довольно просто. Ведущий читает строку из STDIN, итератует над всеми файловыми дескрипторами в [1181932]$fds[1181933] и посылает строку дескриптору этого файла ([1181934]printf ... >&$fd[1181935]).

  1. Результат выглядит следующим образом:
  2. Где я набрал [1181936]hello[1181937] и [1181938]world[1181939].[1181501].
25
27.01.2020, 19:52

tee и bash :

cat foo | tee >(manager) >(manager) >(manager) >(manager) >(manager) >/dev/null

Если количество менеджеров должно быть настраиваемым или если вы хотите, чтобы вывод от разных менеджеров не смешивался:

export -f manager
cat foo | parallel --pipe --tee manager ::: {1..10}
0
27.01.2020, 19:52

Теги

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