我有这个简单的脚本来检查远程服务器上的mysql(db-test-1和db-test-2)是否处于SST模式并向松弛通道发送消息。该脚本在专用于运行cron作业的第三台服务器上运行。以下是代码:
#!/bin/bash
time=$(date);
array=( db-test-1 db-test-2 )
for i in "${array[@]}"
do
S=$(ssh $i ps -ef |grep mysql | grep wsrep_sst_xtrabackup-v2);
if [[ "$S" != "" ]]; then
curl -X POST --data-urlencode "payload={\"channel\": \"#db-share-test\", \"username\": \"wsrep_local_state_comment\", \"text\": \"*$i*: ${time}\n>State transfer in progress, setting sleep higher mysqld\", \"icon_emoji\": \":scorpion:\"}" https://hooks.slack.com/services/G824ZJS9N/B6QS5JEKP/ZjV1hmM1k4dZGsf9HDC1o1jd
exit 0
else
curl -X POST --data-urlencode "payload={\"channel\": \"#db-share-test\", \"username\": \"wsrep_local_state_comment\", \"text\": \"*$i*: ${time}\n>State transfer is complete. Server is Synced now.\", \"icon_emoji\": \":scorpion:\"}" https://hooks.slack.com/services/G824ZJS9N/B6QS5JEKP/ZjV1hmM1k4dZGsf9HDC1o1jd
exit 2
fi
done
两个服务器db-test1和db-test-2是PXC集群的一部分。因此,当我在SST中启动db-test-1加入群集时,我会按预期在我的松弛通道中获得以下内容:
*db-test-1*: Sun Aug 27 15:12:44 CST 2017
>State transfer in progress, setting sleep higher mysqld
[3:12]
*db-test-1*: Sun Aug 27 15:12:49 CST 2017
State transfer in progress, setting sleep higher mysqld
[3:12]
*db-test-1*: Sun Aug 27 15:12:51 CST 2017
State transfer in progress, setting sleep higher mysqld
[3:12]
*db-test-1*: Sun Aug 27 15:12:54 CST 2017
State transfer in progress, setting sleep higher mysqld
因此结果大约每3秒显示一次。但是,执行此脚本的cron作业计划每分钟运行一次,因此不确定为什么它每隔3秒左右发送一次结果,如上所示。
如何确保每1分钟显示一次结果,以避免我的频道每隔3秒抛出相同的信息?此外,我如何确保在SST完成时,单个消息松弛以指示状态传输已完成,而不是每次两个数据库服务器都不处于SST模式时不停止发送此消息?
答案 0 :(得分:1)
除了检查cron
是否设置正确外,可能还有:
@every_minute /path/to/script
或
*/1 * * * * /path/to/script
确保只运行一次程序也是一件好事,尝试将其添加到cron作业中使用的脚本
*/1 * * * * pgrep script > /dev/null || /path/to/script
或使用类似的东西:
#!/bin/sh
if ps -ef | grep -v grep | grep your_script_name ; then
exit 0
fi
# your code goes below
# ...