perldbi中的执行失败

perldbi中的执行失败,perl,daemon,dbi,Perl,Daemon,Dbi,一段代码。脚本必须变成恶魔,连接到两个数据库,并不断检查一些字段。但我收到了错误。LogDBD::Pg::st execute失败:SSL连接在./remote_imap.pl第55行意外关闭。 数据库的日志为空 my $daemon = Proc::Daemon->new; Proc::Daemon::Init({ work_dir => '/home/olex/develop', child_STDOUT => '/home/olex/dev

一段代码。脚本必须变成恶魔,连接到两个数据库,并不断检查一些字段。但我收到了错误。Log
DBD::Pg::st execute失败:SSL连接在./remote_imap.pl第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


有什么问题吗?

请在分叉kid守护进程后打开数据库。根据我的经验,DB连接几乎从未经历过分叉


这就是为什么当您卸下fork时它会起作用。

您可能会对自己独特的编码标准感到满意,但如果您希望其他人帮助您编写代码,那么最好编写更普通的代码。这对我来说几乎是不可读的。如果你删除了你说的代码部分,那么剩下一条未关闭的
foreach
语句,因此代码将无法编译。您的意思是要删除整个
foreach
?是的,所有的
foreach
。然后您应该一次只写一两行,并测试代码以确保其编译和运行。一次编写这么多的代码很可能会让你有bug,你需要搜索更多的行才能找到它。看起来你试图并行地做一些事情,但你做得不对。使用类似于Parallel::ForkManager的方法,并确保在分叉后设置连接。另外,如果您想寻求故障排除帮助,请以合理的方式缩进您的代码。我希望我的手机具有上下文相关的自动更正功能,并具有“talking tech”模式。