【问题标题】:Run a bash script one and stop运行一个 bash 脚本并停止
【发布时间】:2018-02-04 18:12:49
【问题描述】:

我有一个简单的脚本来检查远程服务器(db-test-1 和 db-test-2)上的 mysql 是否处于 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 以加入集群时,我在我的 slack 通道中按预期得到以下内容:

*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 模式时都不停地发送此消息?

【问题讨论】:

  • 我认为我们遗漏了一些信息。您当前的脚本将始终在if [[ "$S" != "" ]]; 之后退出,因此 for 循环不会比第一个 i 更远。当您通过命令行调用它时它是否有效,您可以发布您的 crontab 条目吗?您是否在某个地方有另一个您没有发布的循环?
  • 我认为您不需要 --data-urlencode 获取 JSON 数据。
  • 代码很简单,就是包含所有for循环的完整代码。
  • 我希望这些是这些钩子的虚假 URL。
  • @TheGeorgia:首先,您的脚本没有意义。您在具有两个元素的数组上设置了一个循环(顺便说一句,使用 unnecessary 数组,因为无论如何内容都是静态的),但是在处理完第一个元素后退出脚本。其次,您询问 cron 启动进程过于频繁的奇怪之处,但您没有发布您的 crontab。

标签: mysql bash shell cron slack


【解决方案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
# ...

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-09-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-04
    • 2017-12-12
    • 1970-01-01
    • 2023-04-07
    相关资源
    最近更新 更多