如何编写 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 秒)。
所以这就是我面临的问题:我有一个正在平衡的 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 秒)。