![Linux dd:有没有办法重定向其输出以进行监控?](https://linux22.com/image/647449/Linux%20dd%EF%BC%9A%E6%9C%89%E6%B2%A1%E6%9C%89%E5%8A%9E%E6%B3%95%E9%87%8D%E5%AE%9A%E5%90%91%E5%85%B6%E8%BE%93%E5%87%BA%E4%BB%A5%E8%BF%9B%E8%A1%8C%E7%9B%91%E6%8E%A7%EF%BC%9F.png)
有时我工作场所的服务器会出现一些奇怪的行为,这种情况发生在世界各地不同 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