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
?
2 ответа
Вы можете использовать оператор перенаправления >
а также 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
Как вы прямо сказали "Я хочу написать проверку 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