Иногда серверы на моем рабочем месте испытывают странное поведение, это происходит в случайных физических стойках в разных 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>&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