2

90種類のPHPスクリプトを起動するbashスクリプト(CentOS 6.4で実行)があります。

#!/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つのスクリプトを同時に実行することです

これを達成する方法はありますか?

4

2 に答える 2

3

この質問は何度か聞かれますが、適切な答えが見つかりませんでした。私は今、良い解決策を見つけたと思います!

残念ながら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と、php の 5 つのインスタンスが並列に実行されます。1 つが終了すると、次が開始されます。

の名前を に変更Makefileparallel.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.

この場合は、システムの負荷に応じて起動できるジョブの数を決定します。

私はそれをテストし./parallel.mak -j -l 1.0、うまく動作しました。引数なしで最初に4つのプログラムを並行して開始した-jということは、できるだけ多くのプロセスを並行して実行することを意味します。

于 2013-07-10T08:46:32.293 に答える