Прошу прощения за этот действительно основной вопрос, но, похоже, я не нашел первопричину моей проблемы.Perl функция выбора навешивается бесконечно
детали окружающей среды: Perl 5.14.1 Подключение к MS SQL Server с помощью FreeTDS Tsql Linux x64
Вот мой код:
#!/usr/bin/perl -w
use IO::Select;
use strict;
my $query = "";
my $s = IO::Select->new();
$s->add(\*STDIN);
my @STD_IN =();
if ($s->can_read(.5)) {
@STD_IN = <STDIN>;
}
$query .= "@STD_IN\[email protected]";
my $myTmpFile = `mktemp /tmp/$ENV{USER}QueryXXXX`; chomp($myTmpFile);
`echo "use testDB\n$dbQuery\ngo\nquit" > $myTmpFile`;
print(`/usr/bin/tsql -H myhost -p 9999 -U myuser -P mypass -o q < $myTmpFile`);
Когда я запускаю этот сценарий, как этот
$>./myscript "select * from mytable"
это нормально работает, но часто я вижу, что скрипт висит неопределенно.
Я сделал некоторые отладки, запустив ps -ef
вот как это выглядит:
kedar 24659 24574 0 05:50 ttyp3 00:00:00 /usr/bin/perl -w /home/kedar/myscript select * from mytable
Что может быть причиной для зависания здесь? Я пока не понимаю - это очень простой скрипт.
Я проверил PERL документацию для IO :: Выбор и это то, что он говорит -
can_read
$s->can_read([timeout])
Returns array of handles that are ready for reading. timeout is the maximum amount of time to wait before returning an empty list. If timeout is not given, and any handles are registered, then the call blocks.
Но у меня есть тайм-аут в моем сценарии.
Любая идея? Пожалуйста, помогите, поскольку я застрял в выпуске
PS: Некоторые переменные, имена файлов и другие вещи были изменены с оригинала из-за небольшого количества ограничений. Кроме того, этот скрипт написан кем-то другим ранее, и мне нужно сначала установить его. Поэтому, если вы можете думать об альтернативном и чистом способе делать это - это было бы здорово!
Почему вы не используете ['DBI'] (https://metacpan.org/pod/DBI)? – TLP
Это не основной вопрос. – mob
@TLP: Могу ли я подключиться к серверу MSSQL с помощью DBI? – Deadman