2010-08-16 4 views
0

Windows에서 컴퓨터 정보를 캡처하는 도구로 php를 사용하여 로깅 기능을 만들려고합니다. 매 15 초마다 txt 파일이 내부 정보로 생성됩니다. 나는 사용자가 다른 페이지에 액세스하고 중단되지 않는 동안 백그라운드에서 실행되도록하고 싶습니다. 여기 매 15 초마다 PHP 코드의 일부를 반복하십시오.

내가

$query = "SELECT hostname FROM computers ORDER BY hostname ASC"; 
      $computer_search = mysql_query($query); 
      confirm_query($computer_search); 

      while ($computers = mysql_fetch_array($computer_search)){ 
       $COMP = $computers['hostname']; 
       $time = time(); 
       // 1 is the counter entered into the perl script 
       shell_exec('nohup perl logger.pl ' . $COMP . ' 1 > /dev/null 2> /dev/null >> logs/' . $COMP . '-' . $time . '.txt'); 
      } 

를 사용하려고 내가 지금 처음

<?php 
     $tracker = $_GET['counter']; 
     if (isset($tracker) && $tracker == 1) 
     { 
      $_SESSION['tracker'] = 1; 

      $query = "SELECT hostname FROM computers ORDER BY hostname ASC"; 
      $computer_search = mysql_query($query); 
      confirm_query($computer_search); 

      while ($computers = mysql_fetch_array($computer_search)){ 
       $COMP = $computers['hostname']; 
     $time = time(); 
     shell_exec('perl logger.pl ' . $COMP . ' >> logs/' . $COMP . '-' . $time . '.txt'); 
      } 

      redirect_to('index.php?tracker=1'); 
     } 
     elseif (isset($tracker) && $tracker == 0) 
     { 
      $_SESSION['tracker'] = 0; 

      redirect_to('index.php?tracker=0'); 
     } 
    ?> 

을 사용하고 코드입니다 그러나 코드는 하나의 컴퓨터의 정보를 캡처하고 캡처하기 전에 루프에 걸리면 다음 컴퓨터 정보. 반면에 첫 번째 코드는 모든 컴퓨터의 데이터 만 캡처하지만 한 번만 캡처합니다.

logger.pl에 관해서는 여기 내가 한 것입니다.

!/usr/bin/perl -w 
    use BER; 
    use SNMP_util; 
    use SNMP_Session; 

    $MIB1 = ".1.3.6.1.2.1.25.3.3.1.2"; #Cpu Processors 
    $MIB2 = ".1.3.6.1.2.1.1.3"; #System Uptime 
    $MIBIPAdd = ".1.3.6.1.2.1.4.20.1.1"; 

    $HOST = shift; 
    # taken out for 1st code 
    #$tracker = shift; 

    #while ($tracker == 1) 
    { 
    print "Computer Name: $HOST\n"; 
    $count = 0; 
    # ($MIB1) && ($HOST) || die "Usage: $0 MIB_OID HOSTNAME"; 
    (@values) = &snmpwalk("$HOST","$MIB1"); 
    foreach $value (@values) 
     { 
     $count++; 
    if ($value) { 
     $goodvalue = &strip_comment($value); 
     print "CPU Usage of Processor $count: $goodvalue%\n"; } 
     if ($value > 90){ 
      print "Warning: CPU Usage over 90%! \n" 
     } 
    else { warn "No response from host :$HOST:\n"; } 
} 

(@valuesIP) = &snmpwalk("$HOST","$MIBIPAdd"); 
$ipaddress = &strip_comment($valuesIP[1]); 
print "IP Address: $ipaddress \n"; 

($value) = &snmpwalk("public\@$HOST","$MIB2"); 
if ($value) { 
    $goodvalue = &strip_comment($value); 
    print "System Up Time: $goodvalue\n"; } 
else { print "No response from host: $HOST\n"; } 

print "\n"; 
sleep(15); 
    } 

    sub strip_comment 
    { 
$theline = shift; 

$where = index($theline, ":"); 

if($where eq -1){ 
    return $theline; 
} 

$selectedpart = substr($theline, $where); 
$goodpart = substr($selectedpart, 1); 


return $goodpart; 
} 
+1

크론을 사용하고 계십니까? – dmp

+0

펄 줄이 잘못되었습니다. – Ether

+0

안녕 Ether, 그래서 내가 뭘 사용해야합니까? -w없이 시도했지만 작동하지 않습니다. – vrerer

답변

2

당신이 는 15 초마다 실행하려는 코드의 조각 스크립트를 만들 cron 작업을 사용해야합니다, 다음 15 초마다

를 실행하는 스크립트를 예약하는 크론 작업을 추가 루프에서
+0

죄송합니다, 나는 Windows에서하고 있다고 언급하는 것을 잊어 버렸습니다. – vrerer

+0

그런 다음 Windows 예약 된 작업을 사용하십시오. –

+1

@vrerer 창에도 일정 잡기 도구가 있습니다. 'AT' 명령에 대한 windows 매뉴얼을 확인하십시오. –

0

사용 sleep(15);. 타이머가 만료 될 때까지 거의 리소스를 사용하지 않습니다.

+0

나는 그것을 시도하고 사이트가 반복되고 시간이 초과되면 사용자는 사이트에서 아무 것도 할 수 없습니다. – vrerer

+0

프로그램을 무기한으로 실행할 계획이라면'set_time_limit (0)'을해야합니다! – stillstanding

+1

세션 기반 시스템을 사용 중이라면 루프에 들어가기 전에'session_write_close()'를해야합니다. 기본 파일 기반 세션 처리기는 세션 파일을 적극적으로 사용하는 동안 세션 파일을 잠그므로 잠금이 해제 될 때까지 (스크립트 종료 및/또는 세션이 닫힐 때까지) 다른 요청이 진행되지 않습니다. –

관련 문제