mysql - 运行 bash 脚本一并停止

标签 mysql bash shell cron slack

我有一个简单的脚本,用于检查远程服务器(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/

相关文章:

java - JDBC 去错地址

python - 调用 bash 脚本作为 Python 子进程 - Bash 陷入无限循环,输入错误

Mysql暂时抑制唯一索引

mysql - 元查询在数据过多时不返回任何内容

linux - 在 Bash 中将进程限制为 0.5 秒

用于检查文件是否正在创建的 Bash 脚本

Bash 脚本从文件执行命令,但如果取消则跳转到下一个

macos - 从 find : why is -not -path not working? 中排除子目录

linux - 用于创建文件夹和移动文件的 bash 脚本

php - 如何在 php 中循环更新查询并显示它,使其像日志历史记录一样