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

PHP#它每次调用都会创建 90 个目标php path#/some_job_#.php。如果您运行make -j 5,那么它将运行 5 个 php 并行实例。如果一个完成,它将开始下一个。

我将其重命名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,没有 args 意味着尽可能多地并行运行进程。

于 2013-07-10T08:46:32.293 回答
0

同时使用cron和安排它们。或者使用并行

于 2013-07-10T08:04:51.097 回答