Иметь 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 и запланировать их одновременно. Или используйте параллель.

Другие вопросы по тегам