Неуспешно изпълнение в 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;
                 }

perl 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
Това е първият ми скрипт изобщо. (без да броим малкия на bash)   -  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)


Отворете DB, след като разклоните своя детски демон. Моят опит показва, че DB връзките почти никога не преживяват разклонение.

Ето защо работи, когато махнете вилицата.

person Len Jaffe    schedule 10.11.2014
comment
Иска ми се телефонът ми да има чувствителна към контекста автоматична корекция с говорещ технологичен режим. - person Len Jaffe; 11.11.2014