Как создать ограниченную очередь для задач оболочки?

Пользователь к вашему сведению на форуме OpenWRT предположил, что использование WEP является плохой идеей для мостов и что использование WDS вместо этого могло зафиксировать это. Вы пробовали это?

В рассмотрении Ваших конфигураций и сравнении их к учебному руководству Вы связались, похоже, что Вы могли бы пропускать целый раздел. В /etc/config/wireless Вам нужны два названные раздела config 'wifi-iface'. Они оба для того же устройства, но каждый будет иметь option 'mode' 'ap' и другой option 'mode' 'sta'. Похоже, что у Вас только есть 'станция' один на Ваших конфигурациях. Можно ли отправить полный дамп файла конфигурации от обеих единиц?

5
22.09.2017, 13:49
5 ответов

Быстрое прохождение в Google показывает этот интересный подход: http://pebblesinthesand.wordpress.com/2008/05/22/a-srcipt-for-running-processes-in-parallel-in-bash/

for ARG in  $*; do
    command $ARG &
    NPROC=$(($NPROC+1))
    if [ "$NPROC" -ge 4 ]; then
        wait
        NPROC=0
    fi
done
1
27.01.2020, 20:38
  • 1
    Только отправьте ссылку как ответ, и потому что связанный сайт может быть недоступным, и потому что, поскольку это - Ваш ответ, не показывает то, о чем это. Суммируйте основные части ответа здесь и предоставьте ссылку для ссылки. –  Gilles 'SO- stop being evil' 07.12.2011, 01:51

Использование параллель GNU:

find . -name *.gz | parallel --files 'zcat {} | sort' | parallel -X -j1 sort -m {} ';' rm {} > sorted

Можно установить Параллель GNU просто:

wget http://git.savannah.gnu.org/cgit/parallel.git/plain/src/parallel
chmod 755 parallel

Посмотрите вводные видео для узнавания больше: https://www.youtube.com/playlist? list=PL284C9FF2488BC6D1 и обход через учебное руководство (человек parallel_tutorial). Вы командная строка с любовью Вы для него.

4
27.01.2020, 20:38

Я выбрал бы make(1) для этой задачи - это не оболочка, но make(1) jobserver почти точно, что Вы хотели, и эта задача является подходящей к make(1)способности. Обратите внимание что запуск строки gzip -cd располагается с отступом с символом табуляции. Это жизненно важно. (make(1) может также чувствовать себя немного старым время от времени.)

$ cat Makefile 
TXT := $(wildcard *.gz)

all: $(TXT:.gz=.txt)

%.txt:%.gz
    gzip -cd $< | sort > $@
$ cp /usr/share/man/man2/*.gz .
$ ls -l
total 1992
-rw-r--r-- 1 sarnold sarnold  4447 2011-12-06 00:22 aa_change_hat.2.gz
-rw-r--r-- 1 sarnold sarnold  3977 2011-12-06 00:22 aa_change_profile.2.gz
-rw-r--r-- 1 sarnold sarnold  5082 2011-12-06 00:22 accept.2.gz
...
$ time make -j 10
gzip -cd aa_change_hat.2.gz | sort > aa_change_hat.2.txt
gzip -cd aa_change_profile.2.gz | sort > aa_change_profile.2.txt
gzip -cd accept.2.gz | sort > accept.2.txt
gzip -cd accept4.2.gz | sort > accept4.2.txt
gzip -cd access.2.gz | sort > access.2.txt
...
gzip -cd write.2.gz | sort > write.2.txt
gzip -cd writev.2.gz | sort > writev.2.txt

real    0m0.259s
user    0m0.190s
sys 0m0.020s
$ rm w*txt
$ make
gzip -cd wait.2.gz | sort > wait.2.txt
gzip -cd wait3.2.gz | sort > wait3.2.txt
gzip -cd wait4.2.gz | sort > wait4.2.txt
gzip -cd waitid.2.gz | sort > waitid.2.txt
gzip -cd waitpid.2.gz | sort > waitpid.2.txt
gzip -cd write.2.gz | sort > write.2.txt
gzip -cd writev.2.gz | sort > writev.2.txt
$ 

Заметьте с rm w*txt управляйте этим make(1) разумно только делает минимальный объем работы, необходимой, чтобы сделать что-либо.

2
27.01.2020, 20:38
  • 1
    у меня есть до 100 экспериментов для выполнения в Matlab. Но ограничены доступные ядра процессора. Этот ответ точно, в чем я нуждаюсь. –  onemach 25.01.2014, 08:37

Сортировка несжатого содержимого многих сжатых файлов и сохранение результата в несжатом файле:

find. -type f -name '*.gz'
    -exec sh -c 'for n; do zcat "$n" | sort -o "$n.txt"; done' sh {} +

Это выполнит цикл for

for n; do
    zcat "$n" | sort -o "$n.txt"
done

с максимально возможным количеством файлов одновременно. Цикл for, в котором нет in X, будет повторяться по "$@"по умолчанию.

Оболочка sh -cбудет вызываться findс максимально возможным количеством путей к файлам (из-за +вместо \;в конце ), и эти пути будут доступны для оболочка sh -cв $@.


В исходной команде

find. -name *.gz -exec zcat {} | sort > {}.txt \;

у вас проблемы:

  1. *.gzне заключен в кавычки, что означает, что оболочка будет выполнять подстановку имени файла с именами файлов в текущем каталоге.

  2. -execможет работать только с простой командой, а не с конвейером.

  3. Вы не ограничиваетесь обычными файлами, что теоретически означает, что вы можете выбрать каталог с именем something.gz.

0
27.01.2020, 20:38

С GNU xargsвы можете сделать:

xargs -P4 -n 10 -r0a <(find. -name '*.gz' -type f -print0) sh -c '
  for file do
    zcat < "$file" | sort > "$file.txt"
  done' sh {} +

Это вызовет до 4 shпараллельных процессов, каждый из которых обрабатывает до 10 файлов один за другим в цикле.

0
27.01.2020, 20:38

Теги

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