У меня есть сценарий 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
и на бесплатном соке исключения.
Учитывая, что я не вижу никаких очевидных ошибок в сверстнике, почему этот скрипт задерживается, хотя он, похоже, написан в сокете? Может ли интерпретатор увязнуть или нанести какое-то ограничение или ограничение (сценарий работает на очень удобной коробке, поэтому его системные ограничения)?
Спасибо.
Это выглядит нормально, с первого взгляда. Я предполагаю, что у вас проблема на другом конце (сервере). – chrsblck
Пэр правильно получает сообщение в свободном соке исключения, подтвержденном из журналов одноранговых узлов (программное обеспечение/журналы/источник открыты). Затем сверстник закрывает сокет с его конца ... но мой скрипт perl просто зависает, даже если он тоже (предположительно) должен закрыть сокет. Да, это действительно странно. – kmarks2
Что делать, если вы укажете таймаут? Вы регистрируете вывод STDERR в файле 'socket.pl'? Если он блокирует, считая, что аргументы малы, я уверен, что он находится в 'new'. – ikegami