monit 5.16-2 strauchelt bei HTTP-Checks

Seit einem apt-get dist-upgrade auf einem meiner Debian-Server meldete die Überwachungslösung monit Probleme mit dem periodischen Check der Verfügbarkeit von HTTP-Servern:

...
[CET Mar 1 19:28:18] error : 'printer.schloesslistrasse.local' failed protocol test [HTTP] at [10.1.2.3]:80/script/cookieCode.js [TCP/IP] -- HTTP: Error receiving data -- Resource temporarily unavailable
...

(Die URL hatte ich im Zuge des Debugging ergänzt, da ich zuerst nicht sicher war, ob monit eine allfällige HTTP 403er-Meldung sauer aufstossen würde — ohne aktiviertem Browser-JavaScript wird die Seite im wwwroot aber anstandslos ausgeliefert)

Ein zweiter Debian-Server hatte mit exakt denselben Checks keine Probleme. Der kleine, aber feine Unterschied: monit 5.9-1+deb8u1 (jessie, stable) zeigt das Fehlverhalten nicht, während 5.16-2 (sid, unstable) mit HTTP-Checks strauchelt. Doch das realisierte ich leider erst viel, viel später.

Zuerst machte ich mich im Quellcode der Anwendung schlau:

static void check_request(Socket_T socket, Port_T P) {
int status, content_length = -1;
char buf[512];
if (! Socket_readLine(socket, buf, sizeof(buf)))
THROW(IOException, "HTTP: Error receiving data -- %s", STRERROR);

Quelle: Monit / src / protocols / http.c

Das half dann doch weniger als erwartet zur Problemlösung bei.

Als nächste schraubte ich die Geschwätzigkeit der Installation hoch, indem ich in /etc/init.d/monit die Konfigurationsoption MONIT_OPTS anpasste:

...
DAEMON=/usr/bin/monit
CONFIG=/etc/monit/monitrc
NAME=monit
DESC="daemon monitor"
#MONIT_OPTS=
MONIT_OPTS="-vv"
PID="/run/$NAME.pid"
...

Viel mehr gab das Log unter /var/log/monit dann aber doch nicht preis:

...
[CET Mar 1 19:33:55] debug : Socket test failed for [10.1.2.3]:80 -- HTTP: Error receiving data -- Resource temporarily unavailable
[CET Mar 1 19:33:55] error : 'printer.schloesslistrasse.local' failed protocol test [HTTP] at [10.1.2.3]:80/script/cookieCode.js [TCP/IP] -- HTTP: Error receiving data -- Resource temporarily unavailable
[CET Mar 1 19:33:55] debug : -------------------------------------------------------------------------------
[CET Mar 1 19:33:55] debug : /usr/bin/monit() [0x8062c37]
[CET Mar 1 19:33:55] debug : /usr/bin/monit(LogError+0x27) [0x8063097]
[CET Mar 1 19:33:55] debug : /usr/bin/monit(Event_post+0x243) [0x805f573]
[CET Mar 1 19:33:55] debug : /usr/bin/monit() [0x807373f]
[CET Mar 1 19:33:55] debug : /usr/bin/monit(check_remote_host+0x16b) [0x8075bfb]
[CET Mar 1 19:33:55] debug : /usr/bin/monit(validate+0x2e9) [0x8073e99]
[CET Mar 1 19:33:55] debug : /usr/bin/monit(main+0x505) [0x8051d95]
[CET Mar 1 19:33:55] debug : /lib/i386-linux-gnu/i686/cmov/libc.so.6(__libc_start_main+0xde) [0xb728670e]
[CET Mar 1 19:33:55] debug : /usr/bin/monit() [0x8052293]
[CET Mar 1 19:33:55] debug : -------------------------------------------------------------------------------
...

Nach viel Pröbeln hatte ich dann doch endlich die Erkenntnis, dass es wohl nicht die beste Idee war, ein als unstable markiertes Paket zu verwenden. Doch wie downgraden? Ganz einfach:

# apt-get install monit=1:5.9-1+deb8u1

Quelle: How to Downgrade a Package via apt-get?

Damit das Paket aber beim nächsten apt-get dist-upgrade nicht mit der fehlerhaften Version überschrieben wird, musste ich noch folgenden Befehl ausführen:

# apt-mark hold monit

Quelle: PinningHowto

Seither wird meine INBOX nicht mehr mit Warnungen geflutet.