Perl信号处理会截断与DB的连接并导致错误

时间:2014-07-30 22:28:49

标签: linux database oracle perl

我的任务是编写一个Perl脚本(perl v 5.8 - 是我公司使用的),它将文件从文件系统移动到另一个脚本,它会更新Oracle DB 11R2版本中每个文件的位置。

我可以移动文件Ok。我更新数据库确定。 当收到 Ctrl + C 信号时,我无法正常结束脚本。 原因是当脚本连接到数据库时按下 Ctrl + C 。它会立即终止连接,并在执行查询之前返回错误代码。

我曾尝试按照几本书和在线出版物的建议来处理这些信号,但似乎并没有解决这个问题。通常需要几次尝试才能重现它,但最终我设法得到错误条件。

我在下面提供了一些代码快照。

#!/usr/local/PERL/bin/perl -w
my $STOP_SIGNAL = 0;
$SIG{INT}  = \&Shutdown_Handler;
$SIG{KILL} = \&Shutdown_Handler;
# I handle other signals too. No child processes on this script.

while ( $STOP_SIGNAL == 0 ) {
   # Find some files
   # Move some files
   # Update DB with file new location and close db connection
   # Establish a separate DB connecion to double check the transaction.
}

if ($STOP_SIGNAL) {
   print "EXIT DUE TO Ctrl-C SIGNAL\n";
} else {
   print "NORMAL EXIT\n";
}

sub Shutdown_Handler() {
   $STOP_SIGNAL ++;
   return;
}

有没有人碰到过这个?你是怎么解决的? 谢谢Dan。

环境:

PERL:
  perl -version
  This is perl, v5.8.1 built for i686-linux
DATABASE:
  Oracle Database 11g Enterprise Edition Release 11.2.0.3.0 - 64bit Production
  With the Partitioning, OLAP, Data Mining and Real Application Testing options

1 个答案:

答案 0 :(得分:0)

嗯,在我的例子中,这对我来说是件好事。 (perl 5.18.2)

my $stop = 0;

$SIG{INT} = sub { ++$stop; };

while (!$stop) {
      print "live\n";
      sleep 1;
}

print "exit by signal" if ($stop);