Многообразный Run instance of в program in parallel

I have в command, let say php process.php. I want to run 1000 instance of this command to тест похвалите caused on the server. How хан I do this?

Things to заметил:

  • Ctrl+C should закончись all instance at одиннадцать

  • It is going to run on в single core processor so не need of advance feature like multi-threading.

  • Nice to шоу current number of running instance on top

  • Конечный Commands should output in the same

  • Commands requires не неудар в лунку

4
задан 23 December 2015 в 13:37

3 ответа

Можно записать Основную программу для запуска 1000 раз php process.php. Используя fork и exec может быть удобным, если Вы используете C. Когда Ведущее устройство запускает новое php процесс, он также записывает pid.

Шоу текущее количество рабочего экземпляра: Ведущее устройство может контролировать состояние подпроцессов.

Ctrl+C должен завершить весь экземпляр сразу: Ведущее устройство получает сигнал Ctrl+C, и уничтожает все подпроцессы (kill(pid, SIGKILL);) или уведомляет их для выхода.

0
ответ дан 23 November 2019 в 11:37

Вы могли использовать сценарий. Сохраните следующее как run-parallel.sh, и сделайте это исполняемым файлом (chmod +x run-parallel.sh):

#! /bin/bash
trap "pkill -P $$; kill -INT $$" INT

while read n
do
    "$@" &
done < <(seq 1000)
wait

Объяснение:

  • trap ... INT устанавливает команду, которая будет выполнена когда SIGINT сигнал получен (который является сигналом, сгенерированным, когда Вы нажимаете CtrlC).
  • $$ PID текущего процесса (то есть, самого сценария). pkill -P $$ уничтожает те процессы чей родительский процесс i сценарий.
  • Это - конвенция, что программа, которая ловит SIGINT уничтожьте себя использование SIGINT после того как это убралось. Следовательно, kill -INT $$.
  • seq 1000 генерирует числа от 1 до 1 000.
  • while цикл выполняет команду, обеспеченную как аргументы сценарию однажды для каждого числа от seq, и отправляет их в фон.
  • Затем мы wait пока все фоновые процессы не заканчивают выполняться.

Выполните его таким образом:

./run-parallel.sh php process.php
7
ответ дан 23 November 2019 в 11:37

Можно использовать xargs. Просто распечатайте название процесса, который Вы хотите 100 раз и передаете его xargs:

perl -e 'print "/path/to/process.php\n" x 100' | xargs -P 100 -I {} php {} 

Команда Perl просто печатает /path/to/process.php сопровождаемый новой строкой 100 раз. Это затем передается xargs которому говорят запустить до 100 параллельных команд (-P 100). -I {} говорит xargs заменять строку {} с его входом. Поэтому php {} расширен до php /path/to/process.php. Так как все сделано xargs, единственный Ctrl+C уничтожит всех их, и весь вывод печатается к тому же терминалу.

8
ответ дан 23 November 2019 в 11:37

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

Похожие вопросы: