Debian.pro

Блог для пользователей и администраторов Debian


Parallel? Gnu parallel!

Уже не раз мне эта утилита пригодилась. Я уже даже и не вспомню, зачем толком, но вы наверняка придумаете зачем.
Во-первых, хочется оговориться, что есть утилита «просто parallel», а есть GNU parallel. Я в статье именно про GNU-тую пишу версию, потому что она умеет то, что подобного рода утилита уметь должна. А умееет она очень простую вещь — запустить N процессов из пула в Y процессов и контролировать, что сейчас запущено именно N процессов (запускать следующие, пока весь пул не кончится).
Давайте на примерах.
Во-первых, ставим утилиту (актуально только для дебианов, в убунтах до 14.04 нужно искать пакет в PPA):

root@server:~# apt-get install parallel



Создаём простенький файл /root/numbers:

root@server:~# for i in {100..120}; do echo $i >> /tmp/numbers; done



Запускаем parallel. Например, мы собираемся запустить sleep-ов в количестве 20 штук (столько строк в файле), но так, чтобы было запущено не более 3 одновременно. Да легко!

root@server:~# cat /tmp/numbers | parallel -j3 -k "sleep {}"

Собственно, -j3 — не более 3 потоков, {} — отмечаем место, где в команде вставить аргумент, переданный из файла.

Проверим:

root@server:~# ps ax | grep sleep
31697 pts/0 S+ 0:00 /usr/bin/perl -w /usr/bin/parallel -j3 -k sleep {}
31724 pts/0 S+ 0:00 sleep 100
31725 pts/0 S+ 0:00 sleep 101
31726 pts/0 S+ 0:00 sleep 102
31743 pts/1 S+ 0:00 grep sleep

Убиваем первый процесс:

root@server:~# kill 31724

Проверяем опять:

root@server:~# ps ax | grep sleep
31697 pts/0 S+ 0:00 /usr/bin/perl -w /usr/bin/parallel -j3 -k sleep {}
31725 pts/0 S+ 0:00 sleep 101
31726 pts/0 S+ 0:00 sleep 102
31744 pts/0 S+ 0:00 sleep 103
31746 pts/1 S+ 0:00 grep sleep

sleep 100 умерло, sleep 103 запустилось.
Учтите, что kill на процесс parallel убивает не процесс parallel, а текущие запущенные внутри него процессы (то бишь те 3, которые запущены сейчас) — потом запускаются новые. 9-ка убивает сам parallel

Там на самом деле оооочень много опций в мане, я даже не возьмусь описывать. Из полезных лично мне там был maxload (не запускать новые процессы, до тех пор, пока load average не станет ниже Х), —keep-order (которая выводит выхлоп задач в том порядке, в котором они были запущены, а не завершены). В общем — https://www.gnu.org/software/parallel/man.html


Комментарии (1):

  1. Алексей :

    чтоб rsync работал в несколько потоков
    rsync —list-only —port=54368 ip_host::mail_old/domain/ | awk ‘FNR>1 {print $5 }’ | parallel -j 50 rsync —port=54368 -rlpt -uv —progress —delete-after —partial —force ip_host::mail_old/domain/{} /var/mail/domain ‘>’ /tmp/domain/{.}.output

Написать комментарий