Назад | Перейти на главную страницу

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>&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