有时候我工作场所的服务器会出现一些奇怪的现象,它发生在世界各地的不同DC的随机物理机架上。 似乎在同一个机架内的不同机器之间以及同一个机架中的一个机架与另一个机架之间存在networking带宽问题。 每个机架中的所有服务器都有一个到同一个DC中的操作服务器的挂载点。 有时,当奇怪的行为发生…似乎没有足够的带宽之间的各种机器和复制文件到操作服务器上的挂载点花费太长时间。
为了在发生这种情况时测量问题,我运行以下命令:
dd if=/dev/zero of=/proxy_dump/test1.dat bs=1024 count=102
该命令在操作服务器上的/proxy_dump安装点上填充test1.dat文件。 在运行正常的服务器上,输出结果如下所示:
[root@nyproxy5 ~]# /bin/dd if=/dev/zero of=/proxy_dump/test1.dat bs=1024 count=102 102+0 records in 102+0 records out 104448 bytes (104 kB) copied, 0.003486 seconds, 30.0 MB/s [root@nyproxy5 ~]#
在networking问题期间在有问题的服务器上:
[user@ams2proxy24 ~]$ dd if=/dev/zero of=/proxy_dump/test1.dat bs=1024 count=102 102+0 records in 102+0 records out 104448 bytes (104 kB) copied, 2.8736 s, 36.3 kB/s [user@ams2proxy24 ~]$
所以,为了知道它发生在什么时候…我想编写一个Nagios检查,每5分钟运行一次这个命令,我希望显示它的一部分输出。
问题是,我无法以任何方式redirect命令的输出…不是一个文件,而不是在脚本中的variables。 我想以某种方式redirect它,以parsing它,并得到我感兴趣的信息。
有谁知道如何redirectdd的输出?
您可以使用redirect操作符>和2>&1将来自dd命令的输出redirect到您可以编写的任何文件。
例:
dd if=/dev/zero of=/proxy_dump/test1.dat bs=1024 count=102 > /proxy_dump/dd.log 2>&1
这会将输出从dd写入/proxy_dump/dd.log文件。
如果文件不存在,将创builddd.log文件,如果该文件已经存在,则覆盖该内容。 如果您不希望覆盖/proxy_dump/dd.log的前一内容,则可以将redirect符号从>更改为>> 。
要知道这是如何工作的,请通过https://stackoverflow.com/questions/818255/in-the-shell-what-is-21
正如你明确告诉“ 我想写一个Nagios检查 ”,你可能会发现这个小小的PERL脚本很有用,我刚刚写下了这个脚本来获取你的“dd”时间。 应该很容易剪切/粘贴,重用一些现有的插件:
#! /usr/bin/perl -w # All code below, released under GPL 2 license use strict; my $res = undef; my @lines = undef; my %ERRORS; my $line = undef; my $TIMEOUT = 5; my $time = undef; my $verbose = 1; # Just in case of problems, let's not hang Nagios $SIG{'ALRM'} = sub { print "No Answer from dd\n"; exit $ERRORS{"UNKNOWN"}; }; alarm($TIMEOUT); # Execute a "dd" # get the results into $res $res = qx|/bin/dd if=/dev/zero of=/tmp/test1.dat bs=1024 count=102 2>&1|; #Turn off alarm alarm(0); #Split $res into an array of lines @lines = split /\n/, $res; my $count=0; foreach $line (@lines) { print '[output line: '.$count++."] ".$line."\n" if $verbose; # pattern to search is: # 104448 bytes (104 kB) copied, 0,000541348 s, 193 MB/s if ($line =~ /copied,\s([\d.,]+)\ss,/) { $time = $1; $time =~ s/,/\./; } } if ($time) { print "dd took [".$time."] sec to complete\n"; } else { print "unable to fetch dd results\n"; }
发布时,它给出了这个:
me@monitor:/tmp$ ./check_dd.pl [output line: 0] 102+0 records in [output line: 1] 102+0 records out [output line: 2] 104448 bytes (104 kB) copied, 0,000539951 s, 193 MB/s dd took [0.000539951] sec to complete