我想在bash中并行执行N个命令。然后在所有命令完成后接下来的N个命令,然后是接下来的N个命令......
因为我不是shell脚本的专家,所以我使用了PHP。但我怀疑我的代码没有做到我最需要的东西:
<?php
// d() is a function like var_dump()
d($d);
$ips = array(
"83.149.70.159:13012" => 8,
"37.48.118.90:13082" => 77,
"83.149.70.159:13082" => 77,);
d($ips);
reset($ips);
$prx = "storm";
$f = array();
foreach ($d as $calln) {
$ip = current($ips);
$ipkey = key($ips);
d($ip, $ipkey);
$comd = choose_comd($prx);
d( $comd);
$f[] = shell_exec($comd);
d($f);
choose_limiting ($prx);
d($GLOBALS['a']);
}
function choose_comd ($prx) {
d($GLOBALS['calln']);
switch ($prx) {
case "storm":
return "cd /Users/jMac-NEW/HoldingForDO/phub/phubalt_pages && curl -x {$GLOBALS['ipkey']} \"https://catalog.loc.gov/vwebv/search?searchArg={$GLOBALS['calln']}&searchCode=CALL%2B&searchType=1&limitTo=none&fromYear=&toYear=&limitTo=LOCA%3Dall&limitTo=PLAC%3Dall&limitTo=TYPE%3Dall&limitTo=LANG%3Dall&recCount=1200\" >trial_{$GLOBALS['calln']}_out.html 2> trial_{$GLOBALS['calln']}_error.txt &";;
// more cases ...
}
function choose_limiting ($prx){
switch ($prx) {
case "":
if (!next($ips)) {
sleep (80);
reset($ips);
}
case "storm":
if (!isset($GLOBALS['a'])) {
echo "if";
$GLOBALS['a'] = 0;
}
elseif ($GLOBALS['a'] == current($GLOBALS['ips'])) {
echo "elseif";
next($GLOBALS['ips']);
sleep(80/count($GLOBALS['ips']) - 7); // 80 is the standard
$GLOBALS['a'] = 0;
}
else {
echo "else";
$GLOBALS['a']++;
}
}
}
function trying () {
$GLOBALS['a']++;
d($GLOBALS['a']);
}
首先,我不确定围绕shell_exec运行循环(&#34;命令...&amp;&#34;)是否会使所有命令并行运行。
其次,循环遍历所有可能的命令,但是在使用shell_exec()运行每N个命令后,使用任意/估计持续时间为70的sleep()。 70秒的睡眠时间可能会或可能不会与之前执行的所有N个命令的完成相对应,但我只是假设它会在那里。
我可以知道我所做的事是否符合我的目标?如果不是,为什么?还有什么其他解决方案?
实际上我并不介意直接使用bash,但问题是循环的每次迭代都应该从一个php数组$ d中加入一个变量$ calln,该数组填充在未显示的脚本的前面部分中。如果PHP可以做我需要的,请坚持使用PHP。