Иметь 5 запущенных скриптов в любой момент времени
У меня есть сценарий bash (работает под CentOS 6.4), который запускает 90 различных сценариев PHP, т.е.
#!/bin/bash
php path1/some_job_1.php&
php path2/some_job_2.php&
php path3/some_job_3.php&
php path4/some_job_4.php&
php path5/some_job_5.php
php path6/some_job_6.php&
php path7/some_job_7.php&
php path8/some_job_8.php&
php path9/some_job_9.php&
php path10/some_job_10.php
...
exit 0
Чтобы избежать перегрузки моего сервера, я использую амперсанд &
, это работает, но моя цель - всегда запускать 5 скриптов одновременно
Есть ли способ добиться этого?
2 ответа
Этот вопрос появляется несколько раз, но я не мог найти правильный ответ на него. Я думаю, что теперь я нашел хорошее решение!
к несчастью parallel
не является частью стандартных дистрибутивов, но делает это. Имеет переключатель -j
делать параллельно.
man make (1)]: ( больше информации о параллельном выполнении make)
-j [jobs], --jobs[=jobs] Specifies the number of jobs (commands) to run simultaneously. If there is more than one -j option, the last one is effective. If the -j option is given without an argument, make will not limit the number of jobs that can run simultaneously.
Так что с надлежащим Makefile
проблема может быть решена.
.PHONY: all $(PHP_DEST)
# Create an array of targets in the form of PHP1 PHP2 ... PHP90
PHP_DEST := $(addprefix PHP, $(shell seq 1 1 90))
# Default target
all: $(PHP_DEST)
# Run the proper script for each target
$(PHP_DEST):
N=$(subst PHP,,$@); php path$N/some_job_$N.php
Это создает 90 из PHP#
нацеливается на каждый звонок php path#/some_job_#.php
, Если вы запускаете make -j 5
тогда он запустит 5 экземпляров php параллельно. Если один заканчивает, он начинает следующий.
Я переименовал Makefile
в parallel.mak
, Я бегу chmod 700 parallel.mak
и я добавил #!/usr/bin/make -f
до первой строки. Теперь это можно назвать ./parallel.mak -j 5
,
Или даже вы можете использовать более сложные -l
переключатель:
-l [load], --load-average[=load] Specifies that no new jobs (commands) should be started if there are others jobs running and the load average is at least load (a floating-point number). With no argument, removes a previous load limit.
В этом случае make решит, сколько заданий можно запустить в зависимости от загрузки системы.
Я проверил это с ./parallel.mak -j -l 1.0
и беги красиво. Сначала запустили 4 программы параллельно наоборот -j
без аргументов означает запустить как можно больше параллельных процессов.
Использование cron
и запланировать их одновременно. Или используйте параллель.