Hintergrund
Einmal musste ich das Vorhandensein nicht gesendeter Nachrichten in "1C-Bitrix: Site Management" (im Folgenden: Bitrix) überprüfen und Benachrichtigungen darüber erhalten. Probleme beim Versenden von E-Mails waren äußerst selten, aber eher unangenehme Ereignisse. Dies waren normalerweise Bestellungen, Registrierungsbestätigungen und andere wichtige Briefe.
Die Schwierigkeit bestand darin, dass das Senden einer Benachrichtigung mit derselben Methode unzuverlässig wäre , wenn die von Bitrix verwendete Methode zum Senden von E-Mails nicht mehr funktioniert (höchstwahrscheinlich der Grund dafür) .
Beim Googeln fand ich nichts Freies und Fertiges , aber ich stieß auf viele Fragen / Antworten zu nicht gesendeten Nachrichten von Bitrix - wie man sie findet, was die Gründe für ihr Erscheinen sein könnten usw. Daher hielt ich es für notwendig, meine Lösung zu teilen.
Eine Aufgabe
- Details zum Herstellen einer Verbindung zur Datenbank finden Sie in der Bitrix Site-Konfiguration
- Stellen Sie eine Verbindung zur Datenbank her
- Überprüfen Sie die Anzahl der nicht gesendeten E-Mails
- Vergleichen Sie die Menge mit dem Grenzwert
- Treffen Sie eine Entscheidung, um eine Benachrichtigung zu senden
Implementierung
Das Shell-Skript erhält 3 Parameter:
- Der Pfad zur Bitrix-Site-Konfiguration (path_to_bxdb_config)
- Datenbankabfragetext (single_num_value_query)
- Maximal zulässiger Wert (max_num_value)
Für einen korrekten Betrieb muss die Datenbankabfrage einen einzelnen numerischen Wert zurückgeben.
Check_bx_db_value.sh Skriptcode
#!/bin/bash
#
# Site: https://github.com/AlexeyGogolev/check-bx-db-value
#
mysql="$(which mysql)" # mysql
php="$(which php)" # php
declare -A CLParams #
declare -a CLParams_keys #
declare -A DBSettings #
declare -a DBSettings_keys #
DBSettings_keys=(DBLogin DBPassword DBName)
CLParams_keys=(path_to_bxdb_config single_num_value_query max_num_value)
param_num=0 #
#
for key in "${CLParams_keys[@]}" ; do
((param_num++))
CLParams[$key]=${!param_num} # ${!param_num} - $1 $2...
done
# ,
if [ -z "${CLParams[${CLParams_keys[$param_num-1]}]}" ] ; then
printf "Script compares result returned by <${CLParams_keys[1]}> to given <${CLParams_keys[2]}>.\nIf the result more than the given value, then exit with code 1, else exit 0.\n"
printf "Usage: \n\t$(basename ${BASH_SOURCE[0]}) " ; for key in "${CLParams_keys[@]}" ; do printf "<$key> "; done ; printf "\n"
printf "Example: \n\t$(basename ${BASH_SOURCE[0]}) \"/www/ab.cd/bitrix/php_interface/dbconn.php\" \"select count(id) from b_event where SUCCESS_EXEC<>'Y'\" 5\n"
exit 10
fi
#
if ! [ -s "${CLParams[path_to_bxdb_config]}" ] ; then
printf "File ${CLParams[path_to_bxdb_config]} doesn't exist or empty.\n"
exit 20
fi
# " "
echo ${CLParams[single_num_value_query]} | grep -i -q -E 'delete|update|insert|drop' && printf "query \n${CLParams[single_num_value_query]}\nisn't allowed\n" && exit 30
# php-config -n -- php.ini , -r -- <?...?>
for key in "${DBSettings_keys[@]}" ; do
DBSettings[$key]="$($php -n -r 'include("'${CLParams[path_to_bxdb_config]}'"); print $'$key';')"
done
# mysql ( )
export MYSQL_PWD=${DBSettings[DBPassword]}
# : -N -- ; -B - (batch) - "" ; -e
num_value=`${mysql} -u ${DBSettings[DBLogin]} -N -B -e "use ${DBSettings[DBName]}; ${CLParams[single_num_value_query]}"`
#
echo "Result of the query (from DB ${DBSettings[DBName]}): ${num_value}, ${CLParams_keys[2]}: ${CLParams[max_num_value]}"
#
if [ $num_value -gt ${CLParams[max_num_value]} ]; then
exit 1
fi
Ein Beispiel für den Aufruf des Skripts ab_cd_unsent_check.sh
#!/bin/bash
check_bx_db_value.sh \
«/www/ab.cd/bitrix/php_interface/dbconn.php» \
«select count(id) from b_event where SUCCESS_EXEC<>'Y'» \
2
Überprüfen der Ausführungsergebnisse mit Skriptabschlusscodes
:
:
.
:
$ ./ab_cd_unsent_check.sh && echo "success" || echo "failure"
:
Result of the query (from DB ab_cd): 0, max_num_value: 2
success
.
$ ./ab_cd_unsent_check.sh && echo "success" || echo "failure"
:
Result of the query (from DB ab_cd): 4, max_num_value: 2
failure
Alles funktioniert wie es sollte! Im ersten Fall überschreitet der Wert in der Datenbank nicht den angegebenen Wert. Das Skript gibt nach Abschluss den Code 0 aus. Im zweiten Fall überschreitet der Wert in der Datenbank den angegebenen Wert. Das Skript endet mit einem Fehlercode.
Monit konfigurieren
In diesem Artikel werde ich ein Beispiel für eine Überwachungskonfiguration zum Senden von Nachrichten an E-Mails bereitstellen.
Es wird davon ausgegangen, dass monit bereits auf dem Computer installiert und konfiguriert ist.
Um die Zuverlässigkeit zu verbessern, sollten Sie in der monitrc-Konfiguration ein Konto auf einem Mailserver angeben, das sich von dem unterscheidet, das Bitrix zum Senden von Briefen verwendet . Durch Konfigurieren und Ausführen zusätzlicher Skripts in der Überwachungskonfiguration können Sie außerdem Nachrichten an Instant Messenger und soziale Netzwerke senden .
Beispiel für eine Überwachungskonfiguration
/etc/monit.d/.
check program ab_cd_unsent_check with path /home/bitrix/scripts/ab_cd_unsent_check.sh
every 2 cycles
group mail
if status != 0 then alert
/etc/monit.d/.
Zur Vereinfachung der Demonstration wurden in diesem Beispiel 2 Zyklen eingestellt (hier 1 Zyklus = 30 Sekunden).
Damit die Überwachung keine falschen Warnungen sendet, müssen Sie unter realen Bedingungen so viele Zyklen einstellen, dass die Buchstaben Zeit zum Verlassen haben - sie wird empirisch ausgewählt. Hier sollten Sie die durchschnittliche Anzahl der von der Site generierten Nachrichten und die Geschwindigkeit (Zeit) ihrer Verarbeitung durch den Mailserver berücksichtigen.
Führen Sie Folgendes aus, um die Konfigurationsarbeiten im Terminal zu überprüfen:
# systemctl restart monit
# monit status
wir bekommen:
Keine nicht gesendeten Nachrichten
Mit nicht gesendeten Nachrichten
So sehen Monit-Benachrichtigungen aus:
Nicht gesendete Nachrichten wurden angezeigt!
Alle Nachrichten wurden gesendet (jetzt ist alles in Ordnung).
Das Senden von Benachrichtigungen von Monit funktioniert ordnungsgemäß.
Fazit
Ich hoffe, die Lösung hat sich als sehr vielseitig und für andere Aufgaben geeignet erwiesen.
Das ist alles! Die Quellen für den Artikel können hier heruntergeladen werden .
PS Wer ist es nicht schwer, in den Kommentaren zu teilen - haben Sie ähnliche Aufgaben?
Wenn ja, wie werden sie gelöst?