2017-01-24 2 views
0

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

#!/bin/bash 

./hello<params1.txt & 
./hello<params2.txt & 
wait 
./hello<params3.txt & 
./hello<params4.txt & 

где PARAMS файлы параметры, которые Переходят к исполняемым `привета.

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

Есть ли способ сделать это?

+1

Если все четыре процесса могут быть безопасно выполнены одновременно. Тогда, возможно, вы должны позволить Linux (путем удаления 'wait') или GNU Parallel (https://www.gnu.org/software/parallel/) позаботиться о планировании –

+0

Невозможно ответить на ваш вопрос, пока вы не объясните, что ограничения. Может ли все 4 работать параллельно? Если 2 заканчивается первым, может ли 3 и 4 работать до 1 окончания? И если да, могут ли они параллельно друг с другом? –

ответ

1

желаемое поведение очереди, (но не обязательно процессор присвоившей), могут быть сделаны, чтобы работать с command grouping следующим образом:

{ ./hello<params1.txt && ./hello<params3.txt ; } & 
{ ./hello<params2.txt && ./hello<params4.txt ; } 

Демонстрация чего-то вроде выше:

{ { echo a && sleep 2 && echo b ; } & 
    { echo c && sleep 1 && echo d ; } } | tr '\n' ' ' ; echo 

Выходной :

a c d b 
0

Насколько я знаю, вы не можете назначать задания для процессоров и создавать свою собственную очередь заданий на процессор.

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

С этим вы будете контролировать, сколько заданий запускается одновременно, но планировщик ОС будет решать, сколько процессоров будет выделяться каждому, а одно задание может быть параллельным и использовать более одного ЦП.

Смежные вопросы