Scripte mit snmpget hängen sich auf

Hallo zusammen,
Ich lese meine Qnap ts-659pro mit SNMP aus. Nun habe ich das Problem, das sich meine ThreadIDs füllen und das Script nicht mehr beendet wird. Ich habe dann auch den Dienst IPS vom Tray und unter Dienste nicht mehr beenden.
Das Script wird alle 10s aufgerufen und funktioniert auch 1 bis 2 Tage und dann ist nur noch ein ThreadID. Wie habe ich die Möglichkeit den Fehler einzugrenzen.
Vielleicht könnte mal jemand von euch auf das Script schauen.

Ich habe keine Idee mehr was es sein kann das es nicht immer vorkommt.

Gruß
onkeldirk

<?

$host = "192.168.0.96";
$community = "public";
$debug = true;


$cpulast = snmpget("$host","$community",".1.3.6.1.4.1.24681.1.2.1.0"); //Aktuelle CPU Last
$cpulast = str_replace("STRING: \"", "",$cpulast);
$cpulast = str_replace(" %\"", "", $cpulast);
$cpulast = str_replace(".", ",", $cpulast);
SetValue(35355 /*[Haus\Computer Raum\Qnap\CPU Last]*/, $cpulast);
if ($debug) {echo "CPU Last : $cpulast
";}

$cputemp = snmpget("$host","$community",".1.3.6.1.4.1.24681.1.2.5.0"); //Aktuelle CPU Temp
$cputemp = str_replace("STRING: \"", "",$cputemp);
$cputemp = strstr($cputemp, 'C', true);
//$uptime = str_replace(" %\"", "", $uptime);
//$uptime = str_replace(".", ",", $uptime);
SetValue(59548 /*[Haus\Computer Raum\Qnap\CPU Temp]*/, $cputemp);
if ($debug) {echo "CPU Temp : $cputemp
";}

$systemp = snmpget("$host","$community",".1.3.6.1.4.1.24681.1.2.6.0"); //Aktuelle System Temp
$systemp = str_replace("STRING: \"", "",$systemp);
$systemp = strstr($systemp, 'C', true);
SetValue(11753 /*[Haus\Computer Raum\Qnap\System Temp]*/, $systemp);
if ($debug) {echo "Sys Temp : $systemp
";}


$fan1 = snmpget("$host","$community",".1.3.6.1.4.1.24681.1.2.15.1.3.1"); //Aktuelle drehzal Fan1
$fan1 = str_replace("STRING: \"", "", $fan1);
$fan1 = str_replace(" RPM\"", "", $fan1);
SetValue(30019 /*[Haus\Computer Raum\Qnap\Fan 1]*/, $fan1);
if ($debug) {echo "FAN 1 : $fan1
";}

$fan2 = snmpget("$host","$community",".1.3.6.1.4.1.24681.1.2.15.1.3.2"); //Aktuelle drehzal Fan2
$fan2 = str_replace("STRING: \"", "", $fan2);
$fan2 = str_replace(" RPM\"", "", $fan2);
SetValue(57638 /*[Haus\Computer Raum\Qnap\Fan 2]*/, $fan2);
if ($debug) {echo "FAN 2 : $fan2
";}


$uptime = snmpget("$host","$community",".1.3.6.1.2.1.25.1.1.0"); //Aktuelle uptime
$uptime = str_replace("Timeticks: (", "", $uptime);
$uptime = strstr($uptime, ')', false);
$uptime = str_replace(")", "", $uptime);
SetValue(19404 /*[Haus\Computer Raum\Qnap\Uptime]*/,$uptime);
if ($debug) {echo "Upime : $uptime
";}

$stateeth0 = snmpget("$host","$community",".1.3.6.1.2.1.2.2.1.8.3"); //Aktuelle portstatus eth0
$stateeth0 = str_replace("INTEGER: ", "", $stateeth0);
switch ($stateeth0) {
    case 1: SetValue(58530 /*[Haus\Computer Raum\Qnap\Netzwerk\Netzwerk0 State]*/, "UP"); break;
    case 2: SetValue(58530 /*[Haus\Computer Raum\Qnap\Netzwerk\Netzwerk0 State]*/, "Down"); break;
    case 3: SetValue(58530 /*[Haus\Computer Raum\Qnap\Netzwerk\Netzwerk0 State]*/, "testing"); break;
    case 4: SetValue(58530 /*[Haus\Computer Raum\Qnap\Netzwerk\Netzwerk0 State]*/, "unknown"); break;
    case 5: SetValue(58530 /*[Haus\Computer Raum\Qnap\Netzwerk\Netzwerk0 State]*/, "dormant"); break;
    case 6: SetValue(58530 /*[Haus\Computer Raum\Qnap\Netzwerk\Netzwerk0 State]*/, "notPresent"); break;
    case 7: SetValue(58530 /*[Haus\Computer Raum\Qnap\Netzwerk\Netzwerk0 State]*/, "lowerLayerDown"); break;
    default: SetValue(58530 /*[Haus\Computer Raum\Qnap\Netzwerk\Netzwerk0 State]*/, "nicht 1 - 7"); break;
}
if ($debug) {echo "State eth0 : $stateeth0
";}

$stateeth1 = snmpget("$host","$community",".1.3.6.1.2.1.2.2.1.8.2"); //Aktuelle portstatus eth1
$stateeth1 = str_replace("INTEGER: ", "", $stateeth1);
switch ($stateeth1) {
    case 1: SetValue(18819 /*[Haus\Computer Raum\Qnap\Netzwerk\Netzwerk1 State]*/, "UP"); break;
    case 2: SetValue(18819 /*[Haus\Computer Raum\Qnap\Netzwerk\Netzwerk1 State]*/, "Down"); break;
    case 3: SetValue(18819 /*[Haus\Computer Raum\Qnap\Netzwerk\Netzwerk1 State]*/, "testing"); break;
    case 4: SetValue(18819 /*[Haus\Computer Raum\Qnap\Netzwerk\Netzwerk1 State]*/, "unknown"); break;
    case 5: SetValue(18819 /*[Haus\Computer Raum\Qnap\Netzwerk\Netzwerk1 State]*/, "dormant"); break;
    case 6: SetValue(18819 /*[Haus\Computer Raum\Qnap\Netzwerk\Netzwerk1 State]*/, "notPresent"); break;
    case 7: SetValue(18819 /*[Haus\Computer Raum\Qnap\Netzwerk\Netzwerk1 State]*/, "lowerLayerDown"); break;
    default: SetValue(18819 /*[Haus\Computer Raum\Qnap\Netzwerk\Netzwerk1 State]*/, "nicht 1 - 7"); break;
}
if ($debug) {echo "State eth1 : $stateeth1
";}

$speedeth0 = snmpget("$host","$community",".1.3.6.1.2.1.2.2.1.5.3"); //Aktuelle geschwindigkeit eth0
$speedeth0 = str_replace("Gauge32: ", "", $speedeth0);
$speedeth0 = $speedeth0 /1000 /1000;
SetValue(14694 /*[Haus\Computer Raum\Qnap\Netzwerk\Netzwerk0]*/, $speedeth0);
if ($debug) {echo "Speed eth0 : $speedeth0
";}

$speedeth1 = snmpget("$host","$community",".1.3.6.1.2.1.2.2.1.5.2"); //Aktuelle geschwindigkeit eth1
$speedeth1 = str_replace("Gauge32: ", "", $speedeth1);
$speedeth1 = $speedeth1 /1000 /1000;
SetValue(39575 /*[Haus\Computer Raum\Qnap\Netzwerk\Netzwerk1]*/, $speedeth1);
if ($debug) {echo "Speed eth1 : $speedeth1
";}

$temphdd1 = snmpget("$host","$community",".1.3.6.1.4.1.24681.1.2.11.1.3.1"); //Aktuelle Temperatur HDD1
$temphdd1 = str_replace("STRING: ", "", $temphdd1);
$temphdd1 = substr($temphdd1,1,strripos($temphdd1,"C")-1);
SetValue(21839 /*[Haus\Computer Raum\Qnap\Festplatten\Temp. HDD1]*/, $temphdd1);
if ($debug) {echo "Temp HDD1 : $temphdd1
";}
$temphdd2 = snmpget("$host","$community",".1.3.6.1.4.1.24681.1.2.11.1.3.2"); //Aktuelle Temperatur HDD2
$temphdd2 = str_replace("STRING: ", "", $temphdd2);
$temphdd2 = substr($temphdd2,1,strripos($temphdd2,"C")-1);
SetValue(59056 /*[Haus\Computer Raum\Qnap\Festplatten\Temp. HDD2]*/, $temphdd2);
if ($debug) {echo "Temp HDD2 : $temphdd2
";}
$temphdd3 = snmpget("$host","$community",".1.3.6.1.4.1.24681.1.2.11.1.3.3"); //Aktuelle Temperatur HDD3
$temphdd3 = str_replace("STRING: ", "", $temphdd3);
$temphdd3 = substr($temphdd3,1,strripos($temphdd3,"C")-1);
SetValue(54163 /*[Haus\Computer Raum\Qnap\Festplatten\Temp. HDD3]*/, $temphdd3);
if ($debug) {echo "Temp HDD3 : $temphdd3
";}
$temphdd4 = snmpget("$host","$community",".1.3.6.1.4.1.24681.1.2.11.1.3.4"); //Aktuelle Temperatur HDD4
$temphdd4 = str_replace("STRING: ", "", $temphdd4);
$temphdd4 = substr($temphdd4,1,strripos($temphdd4,"C")-1);
SetValue(55732 /*[Haus\Computer Raum\Qnap\Festplatten\Temp. HDD4]*/, $temphdd4);
if ($debug) {echo "Temp HDD4 : $temphdd4
";}
$temphdd5 = snmpget("$host","$community",".1.3.6.1.4.1.24681.1.2.11.1.3.5"); //Aktuelle Temperatur HDD5
$temphdd5 = str_replace("STRING: ", "", $temphdd5);
$temphdd5 = substr($temphdd5,1,strripos($temphdd5,"C")-1);
SetValue(13250 /*[Haus\Computer Raum\Qnap\Festplatten\Temp. HDD5]*/, $temphdd5);
if ($debug) {echo "Temp HDD5 : $temphdd5
";}
$temphdd6 = snmpget("$host","$community",".1.3.6.1.4.1.24681.1.2.11.1.3.6"); //Aktuelle Temperatur HDD6
$temphdd6 = str_replace("STRING: ", "", $temphdd6);
$temphdd6 = substr($temphdd6,1,strripos($temphdd6,"C")-1);
SetValue(51277 /*[Haus\Computer Raum\Qnap\Festplatten\Temp. HDD6]*/, $temphdd6);
if ($debug) {echo "Temp HDD6 : $temphdd6
";}


$statushd1 = snmpget("$host","$community",".1.3.6.1.4.1.24681.1.2.11.1.4.1"); //Aktuelle Stataus der Festplatte 1
$statushd1 = str_replace("INTEGER: ", "", $statushd1);
//INTEGER {ready(0),noDisk(-5),invalid(-6),rwError(-9),unknown(-4)}
switch ($statushd1) {
    case 0: SetValue(58245 /*[Haus\Computer Raum\Qnap\Festplatten\Status HD1]*/, "ready"); break;
    case -5: SetValue(58245 /*[Haus\Computer Raum\Qnap\Festplatten\Status HD1]*/, "noDisk"); break;
    case -6: SetValue(58245 /*[Haus\Computer Raum\Qnap\Festplatten\Status HD1]*/, "invalid"); break;
    case -9: SetValue(58245 /*[Haus\Computer Raum\Qnap\Festplatten\Status HD1]*/, "rwError"); break;
    case -4: SetValue(58245 /*[Haus\Computer Raum\Qnap\Festplatten\Status HD1]*/, "unknown"); break;
    default: SetValue(58245 /*[Haus\Computer Raum\Qnap\Festplatten\Status HD1]*/, "nicht 1 - 7"); break;
}
if ($debug) {echo "Status HD1 : $statushd1
";}

$statushd2 = snmpget("$host","$community",".1.3.6.1.4.1.24681.1.2.11.1.4.2"); //Aktuelle Stataus der Festplatte 2
$statushd2 = str_replace("INTEGER: ", "", $statushd2);
//INTEGER {ready(0),noDisk(-5),invalid(-6),rwError(-9),unknown(-4)}
switch ($statushd2) {
    case 0: SetValue(15169 /*[Haus\Computer Raum\Qnap\Festplatten\Status HD2]*/, "ready"); break;
    case -5: SetValue(15169 /*[Haus\Computer Raum\Qnap\Festplatten\Status HD2]*/, "noDisk"); break;
    case -6: SetValue(15169 /*[Haus\Computer Raum\Qnap\Festplatten\Status HD2]*/, "invalid"); break;
    case -9: SetValue(15169 /*[Haus\Computer Raum\Qnap\Festplatten\Status HD2]*/, "rwError"); break;
    case -4: SetValue(15169 /*[Haus\Computer Raum\Qnap\Festplatten\Status HD2]*/, "unknown"); break;
    default: SetValue(15169 /*[Haus\Computer Raum\Qnap\Festplatten\Status HD2]*/, "nicht 1 - 7"); break;
}
if ($debug) {echo "Status HD2 : $statushd2
";}

$statushd3 = snmpget("$host","$community",".1.3.6.1.4.1.24681.1.2.11.1.4.3"); //Aktuelle Stataus der Festplatte 3
$statushd3 = str_replace("INTEGER: ", "", $statushd3);
//INTEGER {ready(0),noDisk(-5),invalid(-6),rwError(-9),unknown(-4)}
switch ($statushd3) {
    case 0: SetValue(24764 /*[Haus\Computer Raum\Qnap\Festplatten\Status HD3]*/, "ready"); break;
    case -5: SetValue(24764 /*[Haus\Computer Raum\Qnap\Festplatten\Status HD3]*/, "noDisk"); break;
    case -6: SetValue(24764 /*[Haus\Computer Raum\Qnap\Festplatten\Status HD3]*/, "invalid"); break;
    case -9: SetValue(24764 /*[Haus\Computer Raum\Qnap\Festplatten\Status HD3]*/, "rwError"); break;
    case -4: SetValue(24764 /*[Haus\Computer Raum\Qnap\Festplatten\Status HD3]*/, "unknown"); break;
    default: SetValue(24764 /*[Haus\Computer Raum\Qnap\Festplatten\Status HD3]*/, "nicht 1 - 7"); break;
}
if ($debug) {echo "Status HD3 : $statushd3
";}

$statushd4 = snmpget("$host","$community",".1.3.6.1.4.1.24681.1.2.11.1.4.4"); //Aktuelle Stataus der Festplatte 4
$statushd4 = str_replace("INTEGER: ", "", $statushd4);
//INTEGER {ready(0),noDisk(-5),invalid(-6),rwError(-9),unknown(-4)}
switch ($statushd4) {
    case 0: SetValue(52335 /*[Haus\Computer Raum\Qnap\Festplatten\Status HD4]*/, "ready"); break;
    case -5: SetValue(52335 /*[Haus\Computer Raum\Qnap\Festplatten\Status HD4]*/, "noDisk"); break;
    case -6: SetValue(52335 /*[Haus\Computer Raum\Qnap\Festplatten\Status HD4]*/, "invalid"); break;
    case -9: SetValue(52335 /*[Haus\Computer Raum\Qnap\Festplatten\Status HD4]*/, "rwError"); break;
    case -4: SetValue(52335 /*[Haus\Computer Raum\Qnap\Festplatten\Status HD4]*/, "unknown"); break;
    default: SetValue(52335 /*[Haus\Computer Raum\Qnap\Festplatten\Status HD4]*/, "nicht 1 - 7"); break;
}
if ($debug) {echo "Status HD4 : $statushd4
";}

$statushd5 = snmpget("$host","$community",".1.3.6.1.4.1.24681.1.2.11.1.4.5"); //Aktuelle Stataus der Festplatte 5
$statushd5 = str_replace("INTEGER: ", "", $statushd5);
//INTEGER {ready(0),noDisk(-5),invalid(-6),rwError(-9),unknown(-4)}
switch ($statushd5) {
    case 0: SetValue(20907 /*[Haus\Computer Raum\Qnap\Festplatten\Status HD5]*/, "ready"); break;
    case -5: SetValue(20907 /*[Haus\Computer Raum\Qnap\Festplatten\Status HD5]*/, "noDisk"); break;
    case -6: SetValue(20907 /*[Haus\Computer Raum\Qnap\Festplatten\Status HD5]*/, "invalid"); break;
    case -9: SetValue(20907 /*[Haus\Computer Raum\Qnap\Festplatten\Status HD5]*/, "rwError"); break;
    case -4: SetValue(20907 /*[Haus\Computer Raum\Qnap\Festplatten\Status HD5]*/, "unknown"); break;
    default: SetValue(20907 /*[Haus\Computer Raum\Qnap\Festplatten\Status HD5]*/, "nicht 1 - 7"); break;
}
if ($debug) {echo "Status HD5 : $statushd5
";}

$statushd6 = snmpget("$host","$community",".1.3.6.1.4.1.24681.1.2.11.1.4.6"); //Aktuelle Stataus der Festplatte 6
$statushd6 = str_replace("INTEGER: ", "", $statushd6);
//INTEGER {ready(0),noDisk(-5),invalid(-6),rwError(-9),unknown(-4)}
switch ($statushd6) {
    case 0: SetValue(55841 /*[Haus\Computer Raum\Qnap\Festplatten\Status HD6]*/, "ready"); break;
    case -5: SetValue(55841 /*[Haus\Computer Raum\Qnap\Festplatten\Status HD6]*/, "noDisk"); break;
    case -6: SetValue(55841 /*[Haus\Computer Raum\Qnap\Festplatten\Status HD6]*/, "invalid"); break;
    case -9: SetValue(55841 /*[Haus\Computer Raum\Qnap\Festplatten\Status HD6]*/, "rwError"); break;
    case -4: SetValue(55841 /*[Haus\Computer Raum\Qnap\Festplatten\Status HD6]*/, "unknown"); break;
    default: SetValue(55841 /*[Haus\Computer Raum\Qnap\Festplatten\Status HD6]*/, "nicht 1 - 7"); break;
}
if ($debug) {echo "Status HD2 : $statushd2
";}



$totalsize1 = snmpget("$host","$community",".1.3.6.1.4.1.24681.1.2.17.1.4.1"); //Total Size Raid-1
$totalsize1 = str_replace("STRING: ", "", $totalsize1);
$totalsize1 = substr($totalsize1,1,strripos($totalsize1,"TB")-1);
$totalsize1 = str_replace(".", ",", $totalsize1);
SetValue(30545 /*[Haus\Computer Raum\Qnap\Festplatten\Raid-1 Total]*/, $totalsize1);
if ($debug) {echo "Raid-1 : $totalsize1
";}

$totalsize2 = snmpget("$host","$community",".1.3.6.1.4.1.24681.1.2.17.1.4.2"); //Total Size Raid-1
$totalsize2 = str_replace("STRING: ", "", $totalsize2);
$totalsize2 = substr($totalsize2,1,strripos($totalsize2,"TB")-1);
$totalsize2 = str_replace(".", ",", $totalsize2);
SetValue(45508 /*[Haus\Computer Raum\Qnap\Festplatten\Raid-2 Total]*/, $totalsize2);
if ($debug) {echo "Raid-2 : $totalsize2
";}

$totalsize3 = snmpget("$host","$community",".1.3.6.1.4.1.24681.1.2.17.1.4.3"); //Total Size Raid-1
$totalsize3 = str_replace("STRING: ", "", $totalsize3);
$totalsize3 = substr($totalsize3,1,strripos($totalsize3,"TB")-1);
$totalsize3 = str_replace(".", ",", $totalsize3);
SetValue(57155 /*[Haus\Computer Raum\Qnap\Festplatten\Raid-3 Total]*/, $totalsize3);
if ($debug) {echo "Raid-3 : $totalsize3
";}

$freesize1 = snmpget("$host","$community",".1.3.6.1.4.1.24681.1.2.17.1.5.1"); //free Size Raid-1
$freesize1 = str_replace("STRING: ", "", $freesize1);
$freesize1 = substr($freesize1,1,strripos($freesize1,"TB")-1);
$freesize1 = str_replace(".", ",", $freesize1);
SetValue(30070 /*[Haus\Computer Raum\Qnap\Festplatten\Raid-1 Free]*/, $freesize1);
if ($debug) {echo "Raid-1 : $freesize1
";}

$freesize2 = snmpget("$host","$community",".1.3.6.1.4.1.24681.1.2.17.1.5.2"); //free Size Raid-1
$freesize2 = str_replace("STRING: ", "", $freesize2);
$freesize2 = substr($freesize2,1,strripos($freesize2,"TB")-1);
$freesize2 = str_replace(".", ",", $freesize2);
SetValue(38611 /*[Haus\Computer Raum\Qnap\Festplatten\Raid-2 Free]*/, $freesize2);
if ($debug) {echo "Raid-2 : $freesize2
";}

$freesize3 = snmpget("$host","$community",".1.3.6.1.4.1.24681.1.2.17.1.5.3"); //free Size Raid-1
$freesize3 = str_replace("STRING: ", "", $freesize3);
$freesize3 = substr($freesize3,1,strripos($freesize3,"TB")-1);
$freesize3 = str_replace(".", ",", $freesize3);
SetValue(38962 /*[Haus\Computer Raum\Qnap\Festplatten\Raid-3 Free]*/, $freesize3);
if ($debug) {echo "Raid-3 : $freesize3
";}

?>

Hallo onkeldirk,

ich hatte das gleiche Problem bei der Abfrage eines ReadyNAS NV+ und habe nicht wirklich eine Lösung dafür gefunden.
Daraufhin habe ich meine SNMP-Abfragen auf die Nutzung eines kleinen Tools umgestellt (ssnmpq - erster Treffer in Google). Das rufe ich für jeden Parameter einzeln auf, wobei der Abruf in eine Funktion zum Anlegen der Variablen eingebunden ist. Hier nur der Ausschnitt zum SNMP-Abruf:

$object_id = ltrim($object_id,".");
	$value = IPS_Execute("C:/ip-symcon-tools/snmp/ssnmpq/ssnmpq.exe", "/h:$host /c:$community /o:$object_id /v", false, true);

Wenn ich dein Script so anschaue, denke ich du kommst damit klar :wink:

Ich war anfangs skeptisch wegen dem ständigen Ausführen des Programms. Seit der Umstellung läuft aber mein IPS wochenlang durch :loveips:
Allerdings frage ich die Geräte per SNMP nur aller fünf Minuten ab, zehn Sekunden halte ich für übertrieben.

Gruß,
MSC

Hallo MSC,

Ich habe dein Beispiel mal vorgenommen und etwas mit einem anderen Tool von gleichen hersteller ungesetzt.

$oids[$i] = ltrim($oids[$i],".");
    $value = IPS_Execute("c:/IP-Symcon/tools/SNMPTools/SNMPTools.exe", "/query /h:$host /c:$community /o:$oids[$i] /v", false, true);

Ich habe das Script dann noch in 3 Teile aufgeteil, so das ich Last und Temperaturen mit 10s auslesen kann und Festplatten größe alle 10min.

Das war ein sehr hilfreicher TIP!

Ich werde es nun etwas beobachten.

onkeldirk

Ich muss das Thema noch mal vorholen … ich habe jetzt meine Drucker und mein NAS mittels SNMP per Script abgefragt und das gleiche Verhalten (auch 5 Jahre nach dem Post hier) :wink:

Da das eigentlich super funktioniert, nur ab und zu diesem Phänomen führt, würde ich eigentlich ungern auf ein externes Tool ausweichen, weil PHP ja dies schon nativ zur Verfügung stellt.

Allgemeine Frage: Fehlerhafte Scripte, die in der Thread-View als TimeOut rot markiert werden, werden doch irgendwann rausgeworfen und belegen dann keinen Slot mehr, oder? Bei diesen SNMP-ScriptTimeOuts passiert das leider nicht …