Выполнить сбой в perl dbi

Кусок кода. Скрипт должен стать демоном, подключаться к двум базам данных и постоянно проверять какие-то поля. Но я получаю сообщение об ошибке. Журнал DBD::Pg::st execute failed: SSL connection has been closed unexpectedly at ./remote_imap.pl line 55.

Журнал базы данных пуст.

my $daemon = Proc::Daemon->new;
Proc::Daemon::Init({
      work_dir     => '/home/olex/develop',
      child_STDOUT => '/home/olex/develop/output.file',
      child_STDERR => '+>>debug.txt',
      pid_file     => 'remote_imap.pid'
      });
if (Proc::PID::File->running({dir=>'/home/olex/develop', verify=>1})) {
print "Already running\n";
exit 0;
}
my @kids = (0..3);
my @childs;
my $kid_pid;
my ($dbname,$dbuser,$dbpass) = ('***','**','***');
my ($dbhost, $dbhost_ag, $dbport) = ('192.168.0.**', '192.168.0.**', '5432');
my $dbh = DBI->connect("dbi:Pg:dbname=$dbname;host=$dbhost;port=$dbport", $dbuser, $dbpass,
                      { RaiseError => 1
                      , AutoCommit => 0 })
    or die $DBI::errstr;
my $dbh_ag = DBI->connect("dbi:Pg:dbname=$dbname;host=$dbhost_ag;port=$dbport", $dbuser, $dbpass,
                        { RaiseError => 1
                        , AutoCommit => 0 })
            or die $DBI::errstr;
my $status;
my $continue = 1;
$SIG{TERM} = sub { $continue = 0 };
while ($continue) {
foreach $kid_pid (@kids) {
$status = $daemon->Status($kid_pid);
if (!$status){
      $kid_pid = $daemon->Init( { 
                    work_dir     => '/home/olex/develop',
                    pid_file     => 'kid_pid.pid',
                    exec_command => 'perl /home/olex/develop/remote_imapd.pl',
                 } );
                 }
         push @childs, $kid_pid;
                 }

  my @params;
  $params[0] = 2; #DB_USERS_REMOTE_STATUS_PROCESSING
  $params[1] = 1; #DB_IN_QUEUE_STATUS_NEW
  my $childs_proc = join(',', @childs);
# Fetch new records
  my $q = "select id from queues.queue_in where status=? and user_remote_id>? order by date_create asc";
  my $sth_ag = $dbh_ag->prepare($q);
  my $rv_ag = $sth_ag->execute($params[1], 0);
  my $id = $sth_ag->fetchrow_array();
  print $id, "\n";
  *
  *
  *
  sleep(0.0001);

}
$dbh->disconnect();
$dbh_ag->disconnect();

Если я удалю этот код, работает правильно.

foreach $kid_pid (@kids) {
$status = $daemon->Status($kid_pid);
if (!$status){
      $kid_pid = $daemon->Init( { 
                    work_dir     => '/home/olex/develop',
                    pid_file     => 'kid_pid.pid',
                    exec_command => 'perl /home/olex/develop/remote_imapd.pl',
                 } );
                 }
         push @childs, $kid_pid;
                 }

перл v5.18.2 postgresql v8.4

В чем может быть проблема?


person Kostiuk Aleksandr    schedule 10.11.2014    source источник
comment
Вы можете быть довольны своими собственными уникальными стандартами кодирования, но если вы когда-нибудь захотите, чтобы кто-то еще помог вам с вашим кодом, лучше написать что-то более обычное. Для меня это почти нечитабельно.   -  person Borodin    schedule 10.11.2014
comment
Если вы удалите часть кода, о которой вы говорите, у вас останется незакрытый оператор foreach, и поэтому код не будет компилироваться. Вы имели в виду, что удалили весь foreach?   -  person Borodin    schedule 10.11.2014
comment
Да, весь весь foreach.   -  person Kostiuk Aleksandr    schedule 10.11.2014
comment
Извините, это мои первые скрипты на PERL   -  person Kostiuk Aleksandr    schedule 10.11.2014
comment
В Perl нет ничего особенного, что требовало бы другого форматирования. Если бы вы написали подобный код на любом языке, он был бы непонятен.   -  person Borodin    schedule 10.11.2014
comment
Это мой первый скрипт вообще. (не считая мелких на баше)   -  person Kostiuk Aleksandr    schedule 10.11.2014
comment
Затем вы должны написать всего одну или две строки за раз и протестировать свой код, чтобы убедиться, что он компилируется и запускается. Написание такого большого количества кода за один раз повышает гораздо вероятность того, что у вас есть ошибка, и вам придется искать еще много строк, чтобы найти ее.   -  person Borodin    schedule 10.11.2014
comment
Я написал без какой части кода скрипт работает корректно. Запросы к другой БД (которые мне сюда не подходят, работают корректно).   -  person Kostiuk Aleksandr    schedule 10.11.2014
comment
Похоже, вы пытаетесь сделать что-то параллельно, но делаете это неправильно. Используйте что-то вроде Parallel::ForkManager и убедитесь, что вы настроили свои соединения ПОСЛЕ разветвления. Также, пожалуйста, сделайте отступ в своем коде разумным образом, если вы собираетесь обратиться за помощью в устранении неполадок.   -  person AKHolland    schedule 10.11.2014


Ответы (1)


Откройте БД после того, как вы разветвите своего демона ребенка. По моему опыту, соединения с БД почти никогда не выживают после форка.

Вот почему это работает, когда вы снимаете вилку.

person Len Jaffe    schedule 10.11.2014
comment
Я бы хотел, чтобы в моем телефоне была контекстно-зависимая автокоррекция с режимом говорящего техника. - person Len Jaffe; 11.11.2014