2013-05-10 3 views
0

У меня есть сценарий Perl, состоящий из следующих действий:Простой Perl сокет скрипт висит

#!/usr/bin/perl 
# Script name: socket.pl 

# Build socket: 
use IO::Socket; 
my $sock = new IO::Socket::INET (
            PeerAddr => '74.74.74.74', 
            PeerPort => '1543', 
            Proto => 'tcp', 
           ) 
or die "Could not create socket: [email protected]\n"; 

# Make a pipe-delimited string out of the four arguments: 
$data = "$ARGV[0]$ARGV[1]|$ARGV[2]|$ARGV[3]|$ARGV[4]"; 

# Write to socket and immediately close: 
print $sock "$data"; 
close($sock); 

Проблема начинает появляться, когда сценарий вызывается много раз. В сценарии, когда сценарий получает вызов 60 раз в минуту, если я pgrep для socket.pl, я вижу 100 или 200 экземпляров, которые были «запущены» в течение 3 или 4 минут. Сервер, на который они пишут, сразу получает $data и на бесплатном соке исключения.

Учитывая, что я не вижу никаких очевидных ошибок в сверстнике, почему этот скрипт задерживается, хотя он, похоже, написан в сокете? Может ли интерпретатор увязнуть или нанести какое-то ограничение или ограничение (сценарий работает на очень удобной коробке, поэтому его системные ограничения)?

Спасибо.

+1

Это выглядит нормально, с первого взгляда. Я предполагаю, что у вас проблема на другом конце (сервере). – chrsblck

+1

Пэр правильно получает сообщение в свободном соке исключения, подтвержденном из журналов одноранговых узлов (программное обеспечение/журналы/источник открыты). Затем сверстник закрывает сокет с его конца ... но мой скрипт perl просто зависает, даже если он тоже (предположительно) должен закрыть сокет. Да, это действительно странно. – kmarks2

+1

Что делать, если вы укажете таймаут? Вы регистрируете вывод STDERR в файле 'socket.pl'? Если он блокирует, считая, что аргументы малы, я уверен, что он находится в 'new'. – ikegami

ответ

2

Не уверен, что это поможет, но вы можете попробовать закрыть розетку с помощью самого IO::Socket::INET: $sock->close() или $sock->shutdown(2). Также попробуйте добавить exit(0) в конце.

+1

+1 что это должно быть. – chrsblck

+0

Я поставлю их и перепроверяю. Из любопытства, почему не 'close ($ sock)' достаточно хорошо? – kmarks2

+1

Не только 'close ($ sock)' достаточно хороший, он не нужен. Perl сделает это автоматически перед выходом, и система сделает это, если Perl не сделает этого (например, в случае SEGFAULT). – ikegami

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