我有一个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个脚本
&
有没有办法做到这一点?
这个问题弹出了几次,但我找不到合适的答案。我想现在我找到了一个很好的解决方案!
不幸的parallel是,这不是标准发行版的一部分,但make是。它有一个开关-j可做并联。
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只要适当地解决这个问题即可。
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 -j5,它将运行5个php并行实例。如果一个完成,则开始下一个。
PHP#
php path#/some_job_#.php
make -j5
我将重命名Makefile为parallel.mak,然后运行chmod 700 parallel.mak并添加#!/usr/bin/make-f到第一行。现在可以称为./parallel.mak -j 5。
parallel.mak
chmod 700 parallel.mak
#!/usr/bin/make-f
./parallel.mak -j 5
甚至您可以使用更复杂的-l开关:
-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-l1.0并运行良好。相反,它首先并行启动了4个程序,-j而没有args意味着要尽可能多地并行运行进程。
./parallel.mak -j-l1.0