2015-01-16 2 views
1

У меня есть инструмент, который передает данные из порта tcp, и я хотел бы использовать стандартные инструменты в скрипте, чтобы определить, доступен ли поток.Скрипт для проверки трафика с потокового сервера?

Вручную используется ncat, который быстро выходит, если поток данных недоступен.

Вот мой первоначальный Баш скрипт:

#!/bin/bash 
ncat somehost 1234 >/dev/null & 
pid=$! 
sleep 1 
if [ -d /proc/$pid/ ]; then 
    kill -KILL $pid 
    echo "It's alive, ALIVE\!" 
    # Launch clients 
else 
    echo "He's dead, Jim." 
    # Perform resurrection 
fi 

Это работает, но мне интересно, если есть более простой и лучший способ для достижения этой цели, не полагаться на контроль работы или PROCFS или даже Ncat. Я также хотел бы знать, сколько данных было отправлено до истечения тайм-аута.

И, да, в bash ncat host port можно заменить на cat </dev/tcp/host/port, но я также хотел бы избежать bash-isms (так что он может работать в busybox).

Другим подходом было бы использовать wc для подсчета строк/символов, выдаваемых ncat, поскольку он выводит только одну строку и выходит, если соединение не может быть выполнено. Но я не могу ждать навсегда для завершения, если поток завершен, поэтому мне нужно будет использовать что-то вроде timeout, которое имеет свои собственные сложности при попытке получить доступ к выходу команды.

Есть ли «простой» подход, который работает с минимальными зависимостями?

Или мне следует написать простой инструмент? Он будет возвращать количество прочитанных байтов, если было установлено соединение с хостом/портом, отрицательное errno в противном случае, и будет поддерживать время ожидания и спецификацию протокола (tcp/udp). Возвращаемое значение 0 означает, что соединение было выполнено, но данные не дошли до истечения времени ожидания (что хорошо знать).

Или, может быть, заплатить ncat, чтобы сделать это?

+0

Вместо 'timeout' можно перенаправить вывод' ncat' в 'head -n 3', что вызовет ошибку канала после 3 строк (с указанием активного потока). К сожалению, 'ncat' плохо реагирует на' SIGPIPE', и PITA обрабатывает ошибки сигнала в 'bash'. – BobC

ответ

0

Я использую netcat in FreeBSD, у которого есть опция -z, которая просто проверяет, открыт ли порт. Это устраняет фон и сон, которые вы используете в своем скрипте.

-z Specifies that nc should just scan for listening daemons, without 
     sending any data to them. 

Опция существует в Netcat на старом Ubuntu поле здесь, так что может быть вариант для вас.

$ nc -z somehost 1234 && echo "It's alive, ALIVE!" 

Я не вижу эквивалентного варианта в ncat. Вы можете скомпилировать netcat в busybox; это намного меньше, чем ncat, по крайней мере, на моих системах:

Linux:

$ ls -lH `which nc ncat` 
-rwxr-xr-x 1 root root 31296 2010-02-21 01:32 /bin/nc 
-rwxr-xr-x 1 root root 130448 2009-11-06 04:39 /usr/bin/ncat 

FreeBSD:

ls -l `which nc ncat` 
-r-xr-xr-x 1 root wheel 28112 Jan 15 14:53 /usr/bin/nc 
-rwxr-xr-x 1 root wheel 182775 Mar 19 2012 /usr/local/bin/ncat 

Конечно, это не поможет вам проверить объем трафика, который имеет пройти через поток или проанализировать его содержание. Для этого я считаю, что ваше решение новаторское и разумное, хотя задача, которую вы представили, может быть легко разрешима.

Вы можете использовать ps, чтобы избежать зависимости procfs, и вы можете хранить вещи в временном файле для анализа. Обратите внимание, что busybox должен включать mktemp, но вам, вероятно, следует проверить параметры.Я не тестировал это:

#!/bin/sh 

TMPFILE=`mktemp /tmp/str.XXXX` 
trap "rm -f $TMPFILE" 0 1 2 3 15 

nc somehost 1234 > $TMPFILE & 
pid=$! 
sleep 1 

if ps $pid >/dev/null; then 
    kill -KILL $pid 
    echo -n "It's alive, " 
    if [ -s $TMPFILE ]; then 
    echo "ALIVE!" 
    else 
    echo "but unresponsive." 
    fi 
else 
    echo "He's dead, Jim." 
fi 

Это все, что у меня есть. И это не сильно отличается от того, что у вас уже есть.

Другой вариант может заключаться в создании специального инструмента, который вы можете скомпилировать в свой собственный busybox, но это будет вопрос , а не вопрос . :-)

+0

Не думал оглянуться назад на хороший ol 'netcat. Благодаря! – BobC

+0

У меня уже есть код C, необходимый для инструмента, поэтому я, вероятно, сделаю это. – BobC

+0

Использование «nc -w 1 -z somehost 1234» ускоряет работу до тех пор, пока данные ожидаются не реже одного раза в секунду. – BobC