我将一个脚本分成两个脚本,这样我就可以让第二个脚本并行运行所有输入而不是串行运行,这需要很长时间。以下是分成两部分的内容。由于某种原因,第二个exec(snmpwalk)之后我看不到日志记录。
我正在关注exec in background,以使第一个exec不返回线程,因此它可以使第二个脚本在后台运行。具体来说,我正在该链接上使用hotmail dot com上推荐的vi_pa。
status_parallel.php:
<?php
error_reporting(E_ALL );
$cng_ip_array = array("1.18.8.78", "4.13.8.75", "4.13.81.72", "4.18.8.76", "4.18.8.22", "4.18.8.81", "4.18.8.74", "4.18.8.23", "4.18.8.156", "4.18.8.73", "40.18.8.77", "4.18.8.80", "2.19.19.80", ); //these are not real ip's
foreach($cng_ip_array as $ip)
{
$logFile = "/opt/scripts/catv_monitoring/catv/phperror." . $ip . ".log";
print "ip: " . $ip . "\n";
exec("php getStatus.php $ip 2>$logFile >&- <&- >$logFile &"); //http://php.net/manual/en/ref.exec.php
}
?>
getStatus.php:
<?php
date_default_timezone_set('America/Chicago');
error_reporting(E_ALL ); //& ~E_NOTICE | ~E_WARNING
echo "hi " . $argv[1] . " " . date('h:i:s'); //this is what I see in log
$ip = $argv[1];
$output=array();
print "Doing snmpwalk for ip, " . $ip . ", next. Please wait. " . date('h:i:s') . "\n";
exec(" snmpwalk -v2c -c commString $ip OIDnums ", $output); //this works in old script, so should be fine here
//but snmpwalk does not return and I don't see next logging
foreach($output as $line) { //each outputline of snmpwalk
//do things
} //foreach output line of snmpwalk
echo "done with status for " . $ip . " " . date('h:i:s') . "\n"; //I don't see this
?>
我在status_parallel脚本中为屏幕输出创建的每个日志文件中都看到了这一点:
日志中的典型输出(日志的时间戳已更新)-
prompt:$ more phperror.<ip>.log
hi <ip> 07:16:25Doing snmpwalk for ip, <ip>, next. Please wait.
我检查了后台进程,并且在运行脚本之后,没有进程仍在后台运行:
prompt:$ ps -elf | grep getStatus
0 S employeeID 29635 3604 0 80 0 - 1597 pipe_w 07:21 pts/0 00:00:00 grep getStatus
我认为第二位执行者正受到第一位执行者输出的影响,并且我给了它。我需要让第一个执行程序允许它在后台运行。第二位执行人员需要返回并继续执行代码。知道如何让第二个流程返回吗?
更新
我尝试更换
exec("snmpwalk...",$output)
`exec("ls",$output)`
echo "output results: \n";
var_dump($output);
,日志文件显示目录列表,但线程永不返回,日志文件也不显示“状态为”。这很重要,因为我需要将snmpwalk结果写入我的数据库。 示例:
$ more phperror.<ip>.log
hi <ip> 08:26:19Doing snmpwalk for ip, <ip>, next. Please wait. 08:26:19
output results:
array(61) {
[0]=>
string(18) "ModemData.csv"
[1]=>
string(18) "ModemData.sql"
[2]=>
string(9) "Keith.txt"
[3]=>
string(16) "KeithCompare.php"
...
Update2
我注释掉了“ //做事”,并且看到我在文件中的记录已结束:
...
shane.file
triad_addresses.good.php
triad_addresses.php
done with status for <ip> 08:44:55
我将研究“做事”的可能问题。...
答案 0 :(得分:0)
我在这里没有详细介绍的代码存在问题。当我修复它时,问题就消失了