uscr 09.06.2012 18:57
Есть проблема! — Схожу с ума.
Есть список телеканалов вида:Нужно проверить доступность каждого, результат запомнить в базу, снять скриншот.
Конкретный код не показываю, потому, что уже переписывал всё и так и сяк и на 2 скрипта и на 3 и на 1, а проблема одинаковая - значит, дело в голове, а не в коде.
запускаю конструкцию:
Ещё раз - функционал скрипта, который вызывается в цикле ранее был внесён в сам цикл, вынес я его вот почему:
Комментирую в цикле всё, кроме отладочного вывода, и получаю идеальную картину:
Возвращаю вызов скрипта, отладочный вывод выглядит так:
Он как будто сдвигается на несколько колонок. Причём, в файле айдишники идут по порядку (видно в "идеальном выводе"), а тут - после 1 сразу 4, потом глюк, потом ВНЕЗАПНО 29. Что происходит?
P.S.
Переписывал на разный лад, но никогда не трогал while read line do done < ввод - может в этом всё и дело?
P.P.S - это не ошибка. В "идеальном выводе" id=4 соответствует MTVРоссия, а в "кривом" - ТВ3. Исходный файл, разумеется, один и тот же.
P.P.P.S
Заменил "непоймичё" в выводе мускуля (я про исходный файл, он формируется запросом из БД) православными пробелами, получил такую отладку:
Ну и дальше опять мясо...
alex 09.06.2012 20:30 #
+ 0 -
Значит дело в отладочной части скрипта. Ну и так, мысли в слух, может там что с кодировкой?
Значит дело в отладочной части скрипта.
Ну я не совсем плохо же! Разумеется, скрипту передаются кривые параметры.
Ну и так, мысли в слух, может там что с кодировкой?
UTF-8
Да и в "отладочной части" одна строка - echo "id=$id ip=$ip port=$port name=$name state=$state screen=$screenpath" там ломаться нечему.
Может дело в баше? :-)
use strict;
use warnings;
use DBI;
my $db = 'tv.sqlite';
my $dbh = DBI->connect("dbi:SQLite:dbname=$db", '', '');
open FL, 'tv.txt';
while () {
my ($id, $ip, $port, $name, $state, $screen) = split(/\s+/, $_);
$dbh->do( q{insert into tv (id, ip, port, name, state, screen) values (?, ?, ?, ?, ?, ?)},
{},
$id, $ip, $port, $name, $state, $screen
);
}
close FL;
use strict;
use warnings;
use DBI;
my $db = 'tv.sqlite';
my $dbh = DBI->connect("dbi:SQLite:dbname=$db", '', '');
open FL, 'tv.txt';
while () {
my ($id, $ip, $port, $name, $state, $screen) = split(/\s+/, $_);
$dbh->do( q{insert into tv (id, ip, port, name, state, screen) values (?, ?, ?, ?, ?, ?)},
{},
$id, $ip, $port, $name, $state, $screen
);
}
close FL;
Только что повторил твой скрипт с твоей отладкой, все нормально отрабатывает...
Я не понял, ты делаешь выборку из базы, потом что-то там "химичишь" со скриншотами и опять кладешь в базу?
Делаю выборку в файл. Файл скармливаю циклу. В цикле запускаю скрипт, который по сути - обёртка для ffmpg. ffmpg присасывается к потоку и пытается снять скриншот. Я смотрю код завершения и на его основании принимаю решение - работает канал или нет. Пробовал запускать второй скрипт в фоне - вроде как исключено влияние на цикл. Но всё равно ничего не работает.
А если его в режиме отладки запускать, с параметром -x, то не становится понятно, откуда баг?
"ffmpg? Попробую, но как он в принципе может влиять на цикл?" - хотел ответить я, но потом вместо вызова ffmpg сделал тупо sleep 2 - всё работает нормально. Перепишу ка я скрипт вызова на питоне...
ПРОВАЛ! После каталога для скриншотов у меня стоит символ перевода строки. Он почему то не отображается при просмотре исходного файла в редакторе и при выводе скрипта. Отладочный вывод из питончика открыл страшную правду:
['118', '230.3.3.88', '5678', '\xd0\xa2\xd0\xa0\xd0\x9e\xd0\xa1\xd0\xbe\xd1\x8e\xd0\xb7', '0', '/tmp\n']
['118', '230.3.3.88', '5678', '\xd0\xa2\xd0\xa0\xd0\x9e\xd0\xa1\xd0\xbe\xd1\x8e\xd0\xb7', '0', '/tmp\n']