2015-02-24 4 views
0

Я пытаюсь разобрать журналы rsyslog. Для этого я отправляю все свои журналы в socat, который затем отправляет их в Unix Domain Socket. Этот сокет создается через скрипт perl, который прослушивает этот сокет для анализа журналов.Не удалось подключиться к сокету с помощью socat

Моего Баш скрипт, который Rsyslog посылает весь журнал является

if [ ! `pidof -x log_parser.pl` ] 
    then 
./log_parser.pl & 1>&1 
fi 

if [ -S /tmp/sock ] 
then 
/usr/bin/socat -t0 -T0 - UNIX-CONNECT:/tmp/sock 2>> /var/log/socat.log 
fi 

/tmp/sock создаются с помощью PERL скрипта log_parser.pl, который

use IO::Socket::UNIX; 

sub socket_create { 
    $socket_path = '/tmp/sock'; 
    unlink($socket_path); 

    $listner = IO::Socket::UNIX->new(
     Type => SOCK_STREAM, 
     Local => $socket_path, 
     Listen => SOMAXCONN, 
     Blocking => 0, 
    ) 
     or die("Can't create server socket: $!\n"); 

    $socket = $listner->accept() 
     or die("Can't accept connection: $!\n"); 
    } 

    socket_create(); 
    while(1) { 

    chomp($line=<$socket>); 
    print "$line\n"; 
    } 

Существует эта ошибка, я получаю от Соката которого

2015/02/24 11:58:01 socat[4608] E connect(3, AF=1 "/tmp/sock", 11): Connection refused 

Я не являюсь чемпионом в сокетах, поэтому ia я не мог понять, что это такое. Пожалуйста помоги. Заранее спасибо.

Основная проблема заключается в том, что, когда я убиваю свой скрипт perl, тогда скрипт bash должен вызвать его снова и запустить. Что на самом деле происходит, так это то, что sript запущен, но socat не запускается, а дает эту ошибку и никогда не запускается.

+0

Вы определяете подпрограмму, но где вы ее называете? – reinierpost

ответ

1

Я могу дублировать вашу ошибку, если я не запускаю вашу программу perl, прежде чем пытаться использовать socat. Вот то, что работает для меня:

1) my_prog.pl:

use strict; 
use warnings; 
use 5.016; 
use Data::Dumper; 
use IO::Socket::UNIX; 

my $socket_path = '/tmp/sock'; 
unlink $socket_path; 

my $socket = IO::Socket::UNIX->new(
    Local => $socket_path, 
    Type => SOCK_STREAM, 
    Listen => SOMAXCONN, 
) or die "Couldn't create socket: $!"; 

say "Connected to $socket_path..."; 
my $CONN = $socket->accept() 
    or die "Whoops! Failed to open a connection: $!"; 

{ 
    local $/ = undef; #local -> restore previous value when the enclosing scope, delimited by the braces, is exited. 
         #Setting $/ to undef puts file reads in 'slurp mode' => whole file is considered one line. 
    my $file = <$CONN>; #Read one line. 
    print $file; 
}` 

2) $ perl my_prog.pl

3) socat -u -v GOPEN:./data.txt UNIX-CONNECT:/tmp/sock

-u и -v опции не нужны:

-u   Uses unidirectional mode. The first address is only used for 
       reading, and the second address is only used for writing (exam- 
       ple). 


-v   Writes the transferred data not only to their target streams, 
       but also to stderr. The output format is text with some conver- 
       sions for readability, and prefixed with "> " or "< " indicating 
       flow directions. 

4) Вы также можете сделать это следующим образом:

cat data.txt | socat STDIN UNIX-CONNECT:/tmp/sock 

Pipe stdout cat команда socat, а затем список STDIN как один из файлов socat.

Ответ на комментарий:

Этот Баш скрипт работает для меня:

#!/usr/bin/env bash 

echo 'bash script' 

../pperl_programs/my_prog.pl & 
sleep 1s 

socat GOPEN:./data.txt UNIX-CONNECT:/tmp/sock 

Похоже, сценарий Perl не имеет достаточно времени, чтобы настроить сокет перед тем Сокат пытается передать данные ,

+0

Да, я знаю, что эта ошибка возникает, когда я пытаюсь запустить socat перед программой. В моем сценарии bash вы можете видеть, что если программа perl не работает, попробуйте запустить ее, а затем перейдите к socat. Поэтому в идеале эта ошибка не должна появляться, но это все еще происходит, и я не знаю, почему это происходит. – shivams

+0

@srtfmx, см. Конец моего ответа на ответ. – 7stud

+0

спасибо человеку. Это работает для меня. Я некоторое время стучал головой об этом, и это был вопрос сна. Большое спасибо :) – shivams

Смежные вопросы