如何编写 Bash 脚本以根据 Linux 的监视输出对 Ceph 集群作出反应

How to Write a Bash Script that Will React to Ceph Cluster based on Watch Output for Linux

所以这就是我面临的问题:我有一个正在平衡的 Ceph 集群,但偶尔我会从 ceph -s 输出中收到慢速请求消息。我有两个对 ceph 集群开放的终端。使用以下命令将一个终端设置为主动监视慢速请求:

watch "ceph -s | grep -i 'slow'"

因此,我看到出现了两个结果。 其中一个输出如下所示:

Every 2.0s: ceph -s | grep -i 'slow'          Sun Jul 12 02:17:49 2020

            107 slow requests are blocked > 32 sec. Implicated osds 17
,27,37,51,58,81,118,122,124,137,153,160,181,197,205,217,236,259,267,28
3,309,318,323,328,343

此时,如果我看到缓慢的请求弹出,我需要立即将集群设置为:

rbarrett@osd001:~$ sudo ceph osd set norecover
norecover is set

之后缓慢的请求最终会消失,您将必须设置集群以继续恢复。

Every 2.0s: ceph -s | grep -i 'slow'          Sun Jul 12 02:20:07 2020

slow requests 消失后,我必须取消设置 norecover 选项

rbarrett@osd001:~$ sudo ceph osd unset norecover
norecover is unset

所以这是我的问题:如何在 bash 中编写脚本到 运行 作为进程或服务来为我执行此操作?

我的第一个想法是为那个 watch 命令使用一个变量,但是我怎样才能将脚本设置为 运行 并关注集群?

我不介意使用 python,但更喜欢 bash 脚本。

我正在考虑使用类似的东西,但我不知道它是否会持续 运行。

#!/bin/bash
check=$(ceph -s | grep -i "slow requests")
echo $check
if [[ -n $check   ]];then
  echo "setting norecover flag"
  sudo ceph osd set norecover
else
  echo "no slow requests"
  sudo ceph osd unset norecover
fi

有人请确认这是否有效?

您可以在脚本周围使用循环以无限地运行它。

#!/bin/bash

while : ; do
    if sudo ceph -s | grep -i "slow requests"; then
        echo "setting norecover flag"
        sudo ceph osd set norecover
    else
        echo "no slow requests"
        sudo ceph osd unset norecover
    fi
    
    sleep 2
fi

我在检查之间添加了 2 秒的睡眠,以避免 CPU 使用 this 脚本(否则会显着增加集群负载)。您可能需要根据需要进行调整(我建议 不要 低于 2 秒)。