我有一个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
不是标准分配的一部分,而是做成 。 它有一个开关-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个实例。 如果一个完成它开始下一个。
我将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个程序,而没有参数的意思就是运行尽可能多的进程并行。
使用cron
并同时安排它们。 或者使用并行 。