我有一个简单的脚本,用于检查远程服务器(db-test-1 和 db-test-2)上的 mysql 是否处于 SST 模式并向松弛 channel 发送消息。该脚本在专门用于运行 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 加入集群时,我按照预期在 slack channel 中得到以下内容:
*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 分钟显示一次结果,以避免我的 channel 每 3 秒抛出相同的消息?另外,我如何确保当 SST 完成时,向 slack 发送一条消息来指示状态传输已完成,而不是每次两个数据库服务器不处于 SST 模式时不停地发送此消息?
最佳答案
除了检查 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
# ...
关于mysql - 运行 bash 脚本一并停止,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45902659/