首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使zpool状态输出成为脚本

使zpool状态输出成为脚本
EN

Stack Overflow用户
提问于 2017-08-20 17:02:50
回答 1查看 735关注 0票数 2

我如何才能将zpool status -v的输出转换为可用的输出,将数据逐行匹配为data.oriented格式,而不是它使用的愚蠢的“可视”输出,从而使用标准unix类实用程序来编写脚本?我有一个python脚本,它做了一些可以接受的事情,但是python 3完全破坏了它,我并不是为了让某个新版本的python再次破坏它而修复它。(在没有错误的情况下运行脚本之后,它什么也不返回:)

最基本的是,这个空格键的混乱:

代码语言:javascript
复制
              pool: data
             state: ONLINE
            status: Some supported features are not enabled on the pool. The pool can
                    still be used, but some features are unavailable.
            action: Enable all features using 'zpool upgrade'. Once this is done,
                    the pool may no longer be accessible by software that does not support
                    the features. See zpool-features(7) for details.
              scan: scrub repaired 0 in 4h52m with 0 errors on Fri Aug 18 04:52:47 2017
            config:

                    NAME                                            STATE     READ WRITE CKSUM
                    data                                            ONLINE       0     0     0
                      mirror-0                                      ONLINE       0     0     0
                        gptid/6dfb7dbe-68c5-11e6-982d-00e04c68f511  ONLINE       0     0     0
                        gptid/27f40ebe-8f1b-11e4-94f8-3085a9405b85  ONLINE       0     0     0
                        gptid/9244318f-c1b4-11e6-a31d-0cc47ae2abe8  ONLINE       0     0     0
                      mirror-1                                      ONLINE       0     0     0
                        gptid/1993f2d7-8f1b-11e4-94f8-3085a9405b85  ONLINE       0     0     0
                        gptid/529e2c88-f1d1-11e6-89c3-0cc47ae2abe8  ONLINE       0     0     0
                        gptid/53a09a3e-f1d1-11e6-89c3-0cc47ae2abe8  ONLINE       0     0     0
                      mirror-2                                      ONLINE       0     0     0
                        gptid/51f3b377-6a20-11e6-be8c-00e04c68f511  ONLINE       0     0     0
                        gptid/9fb54bde-1e2d-11e7-a83e-0cc47ae2abe8  ONLINE       0     0     0
                        gptid/9eebde32-1e2d-11e7-a83e-0cc47ae2abe8  ONLINE       0     0     0
                    cache
                      gptid/63db5172-20bd-11e7-b561-0cc47ae2abe8    ONLINE       0     0     0

            errors: No known data errors

写成这样的专栏文章:

代码语言:javascript
复制
            NAME                                                            STATE   READ    WRITE   CKSUM
            data                                                            ONLINE  0       0       0
            data    mirror-0                                                ONLINE  0       0       0
            data    mirror-0    gptid/6dfb7dbe-68c5-11e6-982d-00e04c68f511  ONLINE  0       0       0
            data    mirror-0    gptid/27f40ebe-8f1b-11e4-94f8-3085a9405b85  ONLINE  0       0       0
            data    mirror-0    gptid/9244318f-c1b4-11e6-a31d-0cc47ae2abe8  ONLINE  0       0       0
            data    mirror-1                                                ONLINE  0       0       0
            data    mirror-1    gptid/1993f2d7-8f1b-11e4-94f8-3085a9405b85  ONLINE  0       0       0
            data    mirror-1    gptid/529e2c88-f1d1-11e6-89c3-0cc47ae2abe8  ONLINE  0       0       0
            data    mirror-1    gptid/53a09a3e-f1d1-11e6-89c3-0cc47ae2abe8  ONLINE  0       0       0
            data    mirror-2                                                ONLINE  0       0       0
            data    mirror-2    gptid/51f3b377-6a20-11e6-be8c-00e04c68f511  ONLINE  0       0       0
            data    mirror-2    gptid/9fb54bde-1e2d-11e7-a83e-0cc47ae2abe8  ONLINE  0       0       0
            data    mirror-2    gptid/9eebde32-1e2d-11e7-a83e-0cc47ae2abe8  ONLINE  0       0       0
            data    cache
            data    cache       gptid/63db5172-20bd-11e7-b561-0cc47ae2abe8  ONLINE  0   0   0

我可以使用perl来删除和重新排列,但是我无法找到如何动态匹配行的方法,这样就可以使用镜像/raidz123 123/stripe/cache。

代码语言:javascript
复制
            datadata                                            ONLINE       0     0     0
            data  mirror-0                                      ONLINE       0     0     0
            data    gptid/6dfb7dbe-68c5-11e6-982d-00e04c68f511  ONLINE       0     0     0
            data    gptid/27f40ebe-8f1b-11e4-94f8-3085a9405b85  ONLINE       0     0     0
            data    gptid/9244318f-c1b4-11e6-a31d-0cc47ae2abe8  ONLINE       0     0     0
            data  mirror-1                                      ONLINE       0     0     0
            data    gptid/1993f2d7-8f1b-11e4-94f8-3085a9405b85  ONLINE       0     0     0
            data    gptid/529e2c88-f1d1-11e6-89c3-0cc47ae2abe8  ONLINE       0     0     0
            data    gptid/53a09a3e-f1d1-11e6-89c3-0cc47ae2abe8  ONLINE       0     0     0
            data  mirror-2                                      ONLINE       0     0     0
            data    gptid/51f3b377-6a20-11e6-be8c-00e04c68f511  ONLINE       0     0     0
            data    gptid/9fb54bde-1e2d-11e7-a83e-0cc47ae2abe8  ONLINE       0     0     0
            data    gptid/9eebde32-1e2d-11e7-a83e-0cc47ae2abe8  ONLINE       0     0     0
            datacache
            data  gptid/63db5172-20bd-11e7-b561-0cc47ae2abe8    ONLINE       0     0     0

这是生成上述代码的代码。

代码语言:javascript
复制
            zpool status -v data | sed '/   data/, $!d' | grep -v errors: > /tmp/diskslistzpoolstatusdata
            perl -pi -e 's/^\n$//' /tmp/diskslistzpoolstatusdata  #remove blank lines
            perl -pi -e 's/\t$//' /tmp/diskslistzpoolstatusdata
            perl -p -i -e 's/\t//g' /tmp/diskslistzpoolstatusdata
            perl -pi -e 's/^/data/' /tmp/diskslistzpoolstatusdata

额外:

包括每个gptid的浏览摘要和错误行。

代码语言:javascript
复制
            NAME                                                            STATE   READ    WRITE   CKSUM
            misc                                                            ONLINE  0       0       0
            misc    mirror-0                                                ONLINE  0       0       0
            misc    mirror-0    gptid/aefbaf6e-e004-11e6-8f42-0cc47ae2abe8  ONLINE  0       0       0       0err/4h52m/0err/Fri Aug 18 04:52:47 2017    No known data errors
            misc    mirror-0    gptid/affc3cac-e004-11e6-8f42-0cc47ae2abe8  ONLINE  0       0       0       0err/4h52m/0err/Fri Aug 18 04:52:47 2017    No known data errors
            misc    cache       gptid/3139819b-20bd-11e7-b561-0cc47ae2abe8  ONLINE  0       0       0       0err/4h52m/0err/Fri Aug 18 04:52:47 2017    No known data errors
EN

回答 1

Stack Overflow用户

发布于 2017-08-21 08:15:18

不幸的是,没有综合的解决方案可用。你有两个选择:

  1. 用你自己选择的语言解析它。,你已经提取了基本的信息。布局是相对静态的,因为vdevs和池不能嵌套(池包含vdevs,从不池本身),顺序受到尊重( vdev A中没有设备出现在vdev B之后),关键字很少且固定(镜像-N,raidzX等),输出非常小(通常少于数百行)。这意味着您只需遍历每一行,读取所需的信息,将其存储在嵌套对象或简单的数组中,然后转到下一行。
  2. 直接调用适当的C函数,以非可读的形式获取状态并转换输出。要做到这一点,请看一下数据),其中所有的printf-output都是从池数据生成的。您可以镜像此函数,将输出转换为您喜欢的格式,而不是缩进格式,然后从脚本调用您的迷你应用程序来提供您的数据。

如果您熟悉C,我认为选项2会更快一些。就性能而言,这并不重要,因为数据很小(即使是在大型系统上),而且调用很可能非常不频繁(因为池布局不经常变化)。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45784719

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档