Параллелизм Make особенно удобен для сценариев оболочки. Скажем, вы хотите получить время безотказной работы целого набора хостов (или, по сути, выполнить любую медленную операцию). Вы можете сделать это в цикле:
cat hosts | while read host; do echo "$host: $(ssh $host uptime)"; done
Это работает, но медленно. Вы можете распараллелить это, порождая подоболочки:
cat hosts | while read host; do (echo "$host: $(ssh $host uptime)")&; done
Но теперь у вас нет контроля над тем, сколько потоков вы создаете, и CTRL-C не будет чисто прерывать все потоки.
Вот решение Make: сохраните его в файл (например, showuptimes
) и отметьте как исполняемый файл:
#!/usr/bin/make -f
hosts:=$(shell cat)
all: ${hosts}
${hosts} %:
@echo "$@: `ssh $@ uptime`"
.PHONY: ${hosts} all
Теперь запущенный cat hosts | ./showuptimes
будет печатать время безотказной работы один за другим. cat hosts | ./showuptimes -j
запустит их все параллельно. Вызывающая сторона имеет прямой контроль над степенью распараллеливания (-j
) или может указать ее косвенно в зависимости от загрузки системы (-l
).