我有一个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个脚本
有没有办法实现这个目标?
答案 0 :(得分:2)
这个问题多次出现,但我找不到合适的答案。我想现在我找到了一个很好的解决方案!
不幸的是parallel
不是标准发行版的一部分,但make是。它有一个开关-j
来做并行。
man make(1)] :( more info on make's parallel execution)
-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并行实例。如果一个完成则开始下一个。
我将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
没有args意味着尽可能多地运行并行处理。
答案 1 :(得分:0)
使用cron
并同时安排它们。
或者使用parallel。