背景
一旦我需要检查“ 1C-Bitrix:站点管理”(以下称Bitrix)中是否存在未发送的消息,并接收有关它的通知。发送邮件的问题极为少见,但令人不愉快的事件。这些通常是订单,注册确认书和其他重要信件。
困难在于,如果Bitrix使用的发送邮件的方法停止工作(很可能是这种原因),那么使用相同的方法发送通知将是不可靠的。
谷歌搜索,我没有找到免费的现成的东西,但是我遇到了许多有关Bitrix未发送的消息的问题/答案-如何找到它们,它们出现的原因可能是什么,等等。因此,我认为有必要分享我的解决方案。
一个任务
- 从Bitrix站点配置获取有关连接到数据库的详细信息
- 连接到数据库
- 检查未发送的电子邮件数量
- 比较数量与限制
- 决定发送通知
实作
Shell脚本将接收3个参数:
- Bitrix站点配置的路径(path_to_bxdb_config)
- 数据库查询文本(single_num_value_query)
- 最大允许值(max_num_value)
为了正确操作,数据库查询必须返回一个数字值。
Check_bx_db_value.sh脚本代码
#!/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
调用脚本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
用脚本完成代码检查执行结果
:
:
.
:
$ ./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
一切都会正常进行!在第一种情况下,数据库中的值不超过指定的值,脚本在完成时会发出代码0。在第二个中,数据库中的值超过了指定的值,脚本以错误代码结尾。
配置监控
在本文中,我将提供一个用于将消息发送到电子邮件的监视配置的示例。
假定monit已在计算机上安装和配置。
为了提高可靠性,在monitrc配置中,您应该在邮件服务器上指定一个与Bitrix用于发送信件的帐户不同的帐户。此外,通过在monit配置中配置和运行其他脚本,您可以将消息发送到即时通讯程序和社交网络。
监控配置示例
/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/.
为了简化演示,此示例设置了2个周期(此处1个周期= 30秒)。
为了使monit不会发送错误警报,在实际情况下,您需要设置很多周期,以便字母有时间离开-它是根据经验选择的。在这里,您应该考虑站点生成的平均邮件数,以及邮件服务器处理邮件的速度(时间)。
要在终端中检查配置工作,请运行:
# systemctl restart monit
# monit status
我们得到:
没有未发送的消息
有未发送的消息
这是监视通知的样子:
出现未发送的消息!
所有消息均已发送(现在一切正常)。
从monit发送通知可以正常工作。
结论
我希望该解决方案具有多种用途,并适合其他任务。
就这样!文章的来源可以在这里下载。
PS对谁来说不难分享评论-您是否有类似任务?
如果是这样,他们将如何解决?