exec的第二层不返回线程

时间:2018-08-14 12:53:15

标签: php background exec

我将一个脚本分成两个脚本,这样我就可以让第二个脚本并行运行所有输入而不是串行运行,这需要很长时间。以下是分成两部分的内容。由于某种原因,第二个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

我将研究“做事”的可能问题。...

1 个答案:

答案 0 :(得分:0)

我在这里没有详细介绍的代码存在问题。当我修复它时,问题就消失了