Linux dd:有没有办法重定向其输出以进行监控?

Linux dd:有没有办法重定向其输出以进行监控?

有时我工作场所的服务器会出现一些奇怪的行为,这种情况发生在世界各地不同 DC 的随机物理机架上。似乎同一机架内的不同机器之间以及同一 DC 内一个机架与另一个机架之间存在网络带宽问题。每个机架中的所有服务器都有一个指向同一 DC 中的操作服务器的挂载点。有时当奇怪的行为发生时...似乎各个机器之间没有足够的带宽,将文件复制到操作服务器上的挂载点需要太长时间。

为了在问题发生时衡量问题,我运行以下命令:

dd if=/dev/zero of=/proxy_dump/test1.dat bs=1024 count=102

该命令会将test1.dat文件填充到/proxy_dump操作服务器上的挂载点。在正常运行的服务器上,输出将如下所示:

[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 ~]#

在出现网络问题时,在有问题的服务器上:

[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 分钟左右运行一次此命令,并且我希望显示它的一部分输出。

问题是我无法以任何方式重定向命令的输出...不是重定向到文件,也不是重定向到脚本中的变量。我想以某种方式重定向它,以便解析它并获取我感兴趣的信息。

有人知道如何重定向输出吗dd

答案1

您可以使用重定向运算符>2>&1来自 dd 命令的输出重定向到您可以写入的任何文件。

例子:

dd if=/dev/zero of=/proxy_dump/test1.dat bs=1024 count=102 > /proxy_dump/dd.log 2>&1

这会将输出写入dd/proxy_dump/dd.log 文件。

dd.log如果文件不存在,它将创建文件;如果文件已存在,它将覆盖内容。如果您不想覆盖 /proxy_dump/dd.log 的先前内容,您可以将重定向符号从 更改>为。>>

要了解其工作原理,请浏览https://stackoverflow.com/questions/818255/in-the-shell-what-is-21

答案2

正如你明确告诉“我想写一张 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

相关内容