运行一个bash脚本并停止

时间:2017-08-27 07:28:52

标签: mysql bash shell cron slack

我有这个简单的脚本来检查远程服务器上的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模式时不停止发送此消息?

1 个答案:

答案 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
# ...