常见问题常见问题   搜索搜索   会员列表会员列表   团队团队   注册注册    个人资料个人资料   登录查看您的站内信件登录查看您的站内信件   登录登录 

systat有脚本化的参数吗

 
发表新文章   回复文章    FreeBSD China -> 初学指南
阅读上一个主题 :: 阅读下一个主题  
作者 留言
alphachi
老妖


注册时间: 2007-12-10
文章: 1263
来自: @tweetxa

文章发表于: Mon 2015-03-09 10:53:47    发表主题: systat有脚本化的参数吗 引用并回复

如题,想把systat的输出结果捕捉到脚本里,但man了下没找到能调用一次就自动退出的参数。

谢谢大家。

_________________
Paranoid in Sabbath ...
返回页首
阅览会员资料 发送站内信件
anonymouscoward
道士


注册时间: 2013-08-08
文章: 868

文章发表于: Tue 2015-03-10 16:03:32    发表主题: 引用并回复

Perl 新手用户是酱紫脚本化的,看到 systat -if 里的 Total,
打算在 sqlite 里记录一下跑 Tor 路由器上的每个小时网卡流量,
但又不想很 low 的去自己 parse netstat -b -I 的输出

先自动生成一堆 blah blah 文件...
代码:
% h2xs -A -n ifstat
Defaulting to backwards compatibility with perl 5.18.4
If you intend this module to be compatible with earlier perl versions, please
specify a minimum perl version with the -b option.

Writing ifstat/ppport.h
Writing ifstat/lib/ifstat.pm
Writing ifstat/ifstat.xs
Writing ifstat/Makefile.PL
Writing ifstat/README
Writing ifstat/t/ifstat.t
Writing ifstat/Changes
Writing ifstat/MANIFEST
% cd ifstat


然后翻了一下 /usr/src/usr.bin/systat/ifstat.c 看到两个 sysctl(3) 调用,
大致粗糙的抄过来填到前面生成的 ifstat.xs,错误处理什么的都没有, 先试着跑一下看看结果

代码:
% vi ifstat.xs
#define PERL_NO_GET_CONTEXT
#include "EXTERN.h"
#include "perl.h"
#include "XSUB.h"

#include "ppport.h"

#include <sys/types.h>
#include <sys/socket.h>
#include <sys/sysctl.h>
#include <net/if.h>
#include <net/if_mib.h>

MODULE = ifstat      PACKAGE = ifstat      

SV *
ifstat()
CODE:
    u_int  n = 0, i = 0;
    struct ifmibdata *data = NULL;
    size_t len = 0;

    int name0[] = { CTL_NET, PF_LINK, NETLINK_GENERIC, IFMIB_SYSTEM, IFMIB_IFCOUNT };
    int name1[] = { CTL_NET, PF_LINK, NETLINK_GENERIC, IFMIB_IFDATA, 0, IFDATA_GENERAL };
    HV *result = (HV *)sv_2mortal((SV *)newHV());

    len = sizeof(n);
    if (sysctl(name0, 5, (void *)&n, (size_t *)&len, (void *)NULL, (size_t)0) == 0) {
        len = sizeof(*data);
        for (i = 0; i < n; i++) {
            data = (struct ifmibdata *)calloc(1, sizeof(struct ifmibdata));
            name1[4] = i + 1;
            if ((sysctl(name1, 6, (void *)data, (size_t *)&len, (void *)NULL,
                        (size_t)0) != 0) && (errno != ENOENT)) {
            } else {
                HV *ifstat = (HV *)sv_2mortal((SV *)newHV());
                hv_store(ifstat, "ifi_ibytes", 10, newSVnv(data->ifmd_data.ifi_ibytes), 0);
                hv_store(ifstat, "ifi_obytes", 10, newSVnv(data->ifmd_data.ifi_obytes), 0);
                hv_store(ifstat, "ifi_ipackets", 12, newSVnv(data->ifmd_data.ifi_ipackets), 0);
                hv_store(ifstat, "ifi_opackets", 12, newSVnv(data->ifmd_data.ifi_opackets), 0);
                hv_store(result, data->ifmd_name, 8, newRV((SV *)ifstat), 0);
            }
        }
    }
    RETVAL = newRV((SV *)result);
OUTPUT:
    RETVAL


生成 Makefile 然后编译
代码:
% perl Makefile.PL
Checking if your kit is complete...
Looks good
Writing Makefile for ifstat
Writing MYMETA.yml and MYMETA.json

% make
cp lib/ifstat.pm blib/lib/ifstat.pm
/usr/local/bin/perl5.18.4 /usr/local/lib/perl5/5.18/ExtUtils/xsubpp  -typemap /usr/local/lib/perl5/5.18/ExtUtils/typemap  ifstat.xs > ifstat.xsc && mv ifstat.xsc ifstat.c
Please specify prototyping behavior for ifstat.xs (see perlxs manual)
cc -c  -I.  -DHAS_FPSETMASK -DHAS_FLOATINGPOINT_H -fno-strict-aliasing -pipe -I/usr/local/include -O -pipe -G0 -fno-strict-aliasing    -DVERSION=\"0.01\"  -DXS_VERSION=\"0.01\" -DPIC -fPIC "-I/usr/local/lib/perl5/5.18/mach/CORE"   ifstat.c
Running Mkbootstrap for ifstat ()
chmod 644 ifstat.bs
rm -f blib/arch/auto/ifstat/ifstat.so
cc  -shared  -L/usr/ports/lang/perl5.18/work/perl-5.18.4 -L/usr/local/lib/perl5/5.18/mach/CORE -Wl,-rpath=/usr/local/lib/perl5/5.18/mach/CORE -lperl -L/usr/local/lib ifstat.o  -o blib/arch/auto/ifstat/ifstat.so       
chmod 755 blib/arch/auto/ifstat/ifstat.so
cp ifstat.bs blib/arch/auto/ifstat/ifstat.bs
chmod 644 blib/arch/auto/ifstat/ifstat.bs
Manifying blib/man3/ifstat.3


下面就能在 Perl 脚本里直接用了
代码:
% perl -MExtUtils::testlib -MData::Dumper -Mifstat -le '$r=ifstat::ifstat(); print Data::Dumper->Dump([\$r])'
$VAR1 = \{
            'octe0' => {
                            'ifi_ibytes' => '0',
                            'ifi_opackets' => '0',
                            'ifi_ipackets' => '0',
                            'ifi_obytes' => '0'
                          },
            'octe2' => {
                            'ifi_ibytes' => '0',
                            'ifi_opackets' => '0',
                            'ifi_obytes' => '0',
                            'ifi_ipackets' => '0'
                          },
            'octe1' => {
                            'ifi_ibytes' => '162761506902',
                            'ifi_opackets' => '337771568',
                            'ifi_ipackets' => '369516404',
                            'ifi_obytes' => '157676847485'
                          },
            'lo0' => {
                            'ifi_obytes' => '17920',
                            'ifi_ipackets' => '240',
                            'ifi_opackets' => '240',
                            'ifi_ibytes' => '17920'
                          },
            'pflog0' => {
                            'ifi_opackets' => '3000',
                            'ifi_ibytes' => '0',
                            'ifi_obytes' => '99912',
                            'ifi_ipackets' => '0'
                          },
            'pfsync0' => {
                            'ifi_ipackets' => '0',
                            'ifi_obytes' => '0',
                            'ifi_ibytes' => '0',
                            'ifi_opackets' => '0'
                          }
          };

_________________
匿懦的邮件列表
订阅: bsd-talk-subscribe@anonymous744wjcx.onion
退订: bsd-talk-unsubscribe@anonymous744wjcx.onion


最后进行编辑的是 anonymouscoward on Wed 2015-03-11 12:54:26, 总计第 1 次编辑
返回页首
阅览会员资料 发送站内信件
alphachi
老妖


注册时间: 2007-12-10
文章: 1263
来自: @tweetxa

文章发表于: Tue 2015-03-10 17:25:09    发表主题: 引用并回复

正准备要很漏的去处理netstat/iostat/vmstat的输出……

让Perl盲人先消化一下,感谢老德。

_________________
Paranoid in Sabbath ...
返回页首
阅览会员资料 发送站内信件
anonymouscoward
道士


注册时间: 2013-08-08
文章: 868

文章发表于: Tue 2015-03-10 23:12:14    发表主题: 引用并回复

不客气。 systat -if 还算简单,如果是像 systat -vm 那样的也要自己去 parse 输出的话,我直接就跪了 =_=
我觉得不如直接把这些程序里需要用到的部分拆出来,做成简单的 C 程序, 然后输出 JSON / YAML 之类的格式,
现在大部分脚本语言都能读写的,还有类似 textproc/jq 的工具, 如果坚持用 shell 的话……

_________________
匿懦的邮件列表
订阅: bsd-talk-subscribe@anonymous744wjcx.onion
退订: bsd-talk-unsubscribe@anonymous744wjcx.onion
返回页首
阅览会员资料 发送站内信件
harbinbeer
道士


注册时间: 2006-07-27
文章: 829

文章发表于: Wed 2015-03-11 22:44:40    发表主题: 引用并回复

我是来搅局的:捕捉流量?为啥不用SNMP呢?
返回页首
阅览会员资料 发送站内信件
anonymouscoward
道士


注册时间: 2013-08-08
文章: 868

文章发表于: Wed 2015-03-11 23:51:30    发表主题: 引用并回复

harbinbeer 写到:
我是来搅局的:捕捉流量?为啥不用SNMP呢?


我不知道阿尔法螭同学想要抓什么数据,systat 大部份的数据都是读的 MIB,
只是随便举个 systat -if 例子, net-snmp 在 FreeBSD 上也是 sysctl(3) 读的这两个
http://sourceforge.net/p/net-snmp/code/ci/master/tree/agent/mibgroup/mibII/interfaces.c#l2517
http://sourceforge.net/p/net-snmp/code/ci/master/tree/agent/mibgroup/mibII/interfaces.c#l2540

人家做的好全面,有各种系统还有不同版本的,下次我应该直接抄这里的
其实我都不知道 Linux 上是怎么做的,正好补习补习……

_________________
匿懦的邮件列表
订阅: bsd-talk-subscribe@anonymous744wjcx.onion
退订: bsd-talk-unsubscribe@anonymous744wjcx.onion
返回页首
阅览会员资料 发送站内信件
harbinbeer
道士


注册时间: 2006-07-27
文章: 829

文章发表于: Thu 2015-03-12 17:20:31    发表主题: 引用并回复

anonymouscoward 写到:
harbinbeer 写到:
我是来搅局的:捕捉流量?为啥不用SNMP呢?


我不知道阿尔法螭同学想要抓什么数据,systat 大部份的数据都是读的 MIB,
只是随便举个 systat -if 例子, net-snmp 在 FreeBSD 上也是 sysctl(3) 读的这两个
http://sourceforge.net/p/net-snmp/code/ci/master/tree/agent/mibgroup/mibII/interfaces.c#l2517
http://sourceforge.net/p/net-snmp/code/ci/master/tree/agent/mibgroup/mibII/interfaces.c#l2540

人家做的好全面,有各种系统还有不同版本的,下次我应该直接抄这里的
其实我都不知道 Linux 上是怎么做的,正好补习补习……


伸手党表示完全看不懂,我的原则是用现成的 Very Happy
返回页首
阅览会员资料 发送站内信件
alphachi
老妖


注册时间: 2007-12-10
文章: 1263
来自: @tweetxa

文章发表于: Thu 2015-03-12 20:51:40    发表主题: 引用并回复

已经跪了,准备用sysutils/conky抓抓看。 Embarassed
_________________
Paranoid in Sabbath ...
返回页首
阅览会员资料 发送站内信件
anonymouscoward
道士


注册时间: 2013-08-08
文章: 868

文章发表于: Mon 2015-03-16 00:45:31    发表主题: 引用并回复

alphachi 写到:
已经跪了,准备用sysutils/conky抓抓看。 Embarassed


晚上补番的时候解开看 work/conky-1.9.0/src/freebsd.c
获取网卡信息的部份跟 netstat(1) 一样通过用 getifaddrs(3)

Python 新手觉得正好用来练习一下试试
不知道大家都是用什么生成那堆 ctypes 的, ctypesgen? pycparser?
还是有其他什么正常人类使用的工具么……

https://raw.githubusercontent.com/anonymousgit/deprecated/master/getifaddrs.py

代码:
% python3.4  getifaddrs.py
{
    "octe1": {
        "dc:9f:db:00:00:00": {
            "obytes": 164351016994,
            "ibytes": 170002862245,
            "ipackets": 409625909,
            "opackets": 370571788
        },
        "10.10.10.30": {
            "obytes": 159162456365,
            "ibytes": 149449234308,
            "ipackets": 299602633,
            "opackets": 370541279
        }
    },
    "pfsync0": {
        "null": {
            "obytes": 0,
            "ibytes": 0,
            "ipackets": 0,
            "opackets": 0
        }
    },
    "lo0": {
        "null": {
            "obytes": 17920,
            "ibytes": 17920,
            "ipackets": 240,
            "opackets": 240
        },
        "::1": {
            "obytes": 210,
            "ibytes": 210,
            "ipackets": 2,
            "opackets": 2
        },
        "fe80::1": {
            "obytes": 0,
            "ibytes": 0,
            "ipackets": 0,
            "opackets": 0
        },
        "127.0.0.1": {
            "obytes": 17710,
            "ibytes": 14178969398,
            "ipackets": 108767367,
            "opackets": 238
        }
    },
    "pflog0": {
        "null": {
            "obytes": 114680,
            "ibytes": 0,
            "ipackets": 0,
            "opackets": 3447
        }
    },
    "octe0": {
        "dc:9f:db:00:00:00": {
            "obytes": 0,
            "ibytes": 0,
            "ipackets": 0,
            "opackets": 0
        }
    },
    "octe2": {
        "dc:9f:db:00:00:00": {
            "obytes": 0,
            "ibytes": 0,
            "ipackets": 0,
            "opackets": 0
        }
    }
}

_________________
匿懦的邮件列表
订阅: bsd-talk-subscribe@anonymous744wjcx.onion
退订: bsd-talk-unsubscribe@anonymous744wjcx.onion
返回页首
阅览会员资料 发送站内信件
anonymouscoward
道士


注册时间: 2013-08-08
文章: 868

文章发表于: Thu 2015-03-19 13:05:54    发表主题: 引用并回复

anonymouscoward 写到:
但又不想很 low 的去自己 parse netstat -b -I 的输出


好吧,其实上面的都是忽悠

等了这么久也不见有人来指出么……
11.0-CURRENT 去年 libxo 就进 base 了
好多工具都更新了啊

代码:
# netstat --libxo json,pretty -b -I ue0
{
  "statistics": {
    "interface": [
      {
        "name": "ue0",
        "mtu": 1500,
        "network": "<Link#2>",
        "address": "b8:27:eb:00:00:00 ",
        "received-packets": 35851,
        "received-errors": 0,
        "dropped-packet": 0,
        "received-bytes": 37313959,
        "sent-packets": 25806,
        "send-errors": 0,
        "sent-bytes": 4110191,
        "collisions": 0
      },
      {
        "name": "ue0",
        "network": "fe80::ba27:eb",
        "address": "fe80::ba27:ebff:f",
        "received-packets": 0,
        "received-bytes": 0,
        "sent-packets": 2,
        "sent-bytes": 152
      },
      {
        "name": "ue0",
        "network": "10.0.0.0",
        "address": "rpib-freebsd0",
        "received-packets": 29854,
        "received-bytes": 31437139,
        "sent-packets": 22626,
        "sent-bytes": 3336343
      }
    ]
  }
}

# df --libxo json,pretty
{
  "storage-system-information": {
    "filesystem": [
      {
        "name": "10.0.0.1:/pxe/rpib",
        "total-blocks": 1831575201,
        "used-blocks": 41175518,
        "available-blocks": 1790399683,
        "used-percent": 2,
        "mounted-on": "/"
      },
      {
        "name": "devfs",
        "total-blocks": 1,
        "used-blocks": 1,
        "available-blocks": 0,
        "used-percent": 100,
        "mounted-on": "/dev"
      },
      {
        "name": "/dev/md0",
        "total-blocks": 4380,
        "used-blocks": 2728,
        "available-blocks": 1304,
        "used-percent": 68,
        "mounted-on": "/etc"
      },
      {
        "name": "/dev/md1",
        "total-blocks": 15388,
        "used-blocks": 296,
        "available-blocks": 13864,
        "used-percent": 2,
        "mounted-on": "/var"
      },
      {
        "name": "/dev/md2",
        "total-blocks": 15388,
        "used-blocks": 28,
        "available-blocks": 14132,
        "used-percent": 0,
        "mounted-on": "/tmp"
      }
    ]
  }
}

# dmesg | wc --libxo json,pretty
{
  "wc": {
    "file": [
      {
        "lines": 100,
        "words": 686,
        "characters": 4956
      }
    ]
  }
}

_________________
匿懦的邮件列表
订阅: bsd-talk-subscribe@anonymous744wjcx.onion
退订: bsd-talk-unsubscribe@anonymous744wjcx.onion
返回页首
阅览会员资料 发送站内信件
Gehaowu
老妖


注册时间: 2009-07-13
文章: 3203
来自: www

文章发表于: Thu 2015-03-19 13:31:25    发表主题: 引用并回复

anonymouscoward 写到:

11.0-CURRENT 去年 libxo 就进 base 了

XO的库文件进基本系统了 Shocked 那以后喝XO是不是会比较方便呀 Smile Smile Smile

_________________
BITMOE.com
礼尚多有往来,意美人常在
Simplified Chinese Shell/csh,Traditional Chinese Shell/tcsh
返回页首
阅览会员资料 发送站内信件 发送电子邮件 浏览发表者的主页
anonymouscoward
道士


注册时间: 2013-08-08
文章: 868

文章发表于: Thu 2015-03-19 14:23:26    发表主题: 引用并回复

Gehaowu 写到:
anonymouscoward 写到:

11.0-CURRENT 去年 libxo 就进 base 了

XO的库文件进基本系统了 Shocked 那以后喝XO是不是会比较方便呀 Smile Smile Smile


其实前两个礼拜 freebsd-current@ 上就有个挺长的 thread 讨论这个
看上去真好玩,比如这个翻译成中文是不是就是 you can you up, no can no bb
https://lists.freebsd.org/pipermail/freebsd-current/2015-March/054897.html

_________________
匿懦的邮件列表
订阅: bsd-talk-subscribe@anonymous744wjcx.onion
退订: bsd-talk-unsubscribe@anonymous744wjcx.onion
返回页首
阅览会员资料 发送站内信件
syh
老妖


注册时间: 2010-05-02
文章: 1617
来自: 卡拉赞

文章发表于: Sun 2015-12-20 16:20:12    发表主题: 引用并回复

anonymouscoward 写到:
Gehaowu 写到:
anonymouscoward 写到:

11.0-CURRENT 去年 libxo 就进 base 了

XO的库文件进基本系统了 Shocked 那以后喝XO是不是会比较方便呀 Smile Smile Smile


其实前两个礼拜 freebsd-current@ 上就有个挺长的 thread 讨论这个
看上去真好玩,比如这个翻译成中文是不是就是 you can you up, no can no bb
https://lists.freebsd.org/pipermail/freebsd-current/2015-March/054897.html


原来我落伍了那么久……

_________________
又要毕业了。应该是最后一次。
-------------
audio/mous
ports-mgmt/pkg-rmleaf
Buffer Hint: http://www.vim.org/scripts/script.php?script_id=5272
返回页首
阅览会员资料 发送站内信件
Gehaowu
老妖


注册时间: 2009-07-13
文章: 3203
来自: www

文章发表于: Mon 2015-12-21 10:33:37    发表主题: 引用并回复

syh 写到:
anonymouscoward 写到:
Gehaowu 写到:
anonymouscoward 写到:

11.0-CURRENT 去年 libxo 就进 base 了

XO的库文件进基本系统了 Shocked 那以后喝XO是不是会比较方便呀 Smile Smile Smile


其实前两个礼拜 freebsd-current@ 上就有个挺长的 thread 讨论这个
看上去真好玩,比如这个翻译成中文是不是就是 you can you up, no can no bb
https://lists.freebsd.org/pipermail/freebsd-current/2015-March/054897.html


原来我落伍了那么久……


XO 是啥。。。为啥以前我会发。。。
“XO的库文件进基本系统了 :” Shocked Shocked Shocked

_________________
BITMOE.com
礼尚多有往来,意美人常在
Simplified Chinese Shell/csh,Traditional Chinese Shell/tcsh
返回页首
阅览会员资料 发送站内信件 发送电子邮件 浏览发表者的主页
从以前的文章开始显示:   
发表新文章   回复文章    FreeBSD China -> 初学指南 论坛时间为 北京时间
1页/共1

 
转跳到:  
不能发布新主题
不能在这个论坛回复主题
不能在这个论坛编辑自己的文章
不能在这个论坛删除自己的文章
不能在这个论坛发表投票


Powered by phpBB 2023cc © 2003 Opensource Steps; © 2003-2009 The FreeBSD Simplified Chinese Project
Powered by phpBB © 2001, 2005 phpBB Group
Protected by Project Honey Pot and phpBB.cc
silvery-trainer
The FreeBSD China Project 网站: 中文计划网站 社区网站
The FreeBSD China Project 版权所有 (C) 1999 - 2003 网页设计版权 著作权和商标