#!/usr/bin/perl -w
#Description:rerun eod job group by system
#Auther:Suzm
#Date :2015-06-23
use DBI;
use Thread;
use strict;
push( @INC, $ENV{TPMS_EOD_PERL_LIB} );
require public_pg;
my %dbc_info;
my $maxnum = 3;
my %threads;
my $tx_date;
my $path_log = $ENV{TPMS_EOD_LOGPATH};
my $system = get_config('TPMS_SYSTEM_ID');
unless ( defined( $system ) ) {
$system = "error";
}
#my $system = undef;
my $log_name =
uc( CITIC::getscript_name($0) . "_" .$system);
my $log_file = CITIC::create_logfile( $log_name, $path_log );
my $TPMS_EOD_SID = $ENV{TPMS_EOD_SID};
my $my_sysenv = uc( $ENV{MY_SYSENV} );
select $log_file;
$| = 1;
#get eod job info ,return hash
sub getEodJob {
my ( $sysid, $dbh ) = @_;
my %jobinfo;
#my $str = "select * from tpms_eod.T_TPMS_EODTABLE where system='${sysid}'";
my $str = <<EOF;
select a.* from tpms_eod.t_tpms_eodtable a
inner join tpms_eod.Tpms_Rollback_Bizdate b
on a.TX_DATE != b.CURR_BIZ_DATE
or (a.TX_DATE = b.CURR_BIZ_DATE and a.FLAG=1)
where a.SYSTEM='${sysid}'
EOF
my $sth;
eval {
$sth = $dbh->prepare($str);
$sth->execute();
};
if ($@) {
CITIC::showtime();
print "An error occurred ($@)\n";
CITIC::showtime();
print $dbh->errstr . "\n";
$dbh->disconnect();
return %jobinfo;
}
while ( my @row = $sth->fetchrow_array() ) {
$jobinfo{ $row[1] }{"SYSTEM"} = $row[0];
$jobinfo{ $row[1] }{"JOB_SCRIPT"} = $row[2];
$jobinfo{ $row[1] }{"ARGV"} = $row[3];
$jobinfo{ $row[1] }{"START_TIME"} = $row[4];
$jobinfo{ $row[1] }{"END_TIME"} = $row[5];
$jobinfo{ $row[1] }{"TX_DATE"} = $row[6];
$jobinfo{ $row[1] }{"FLAG"} = $row[7];
}
return %jobinfo;
}
#获取配置参数
sub get_config{
my($name) = @_;
my $str;
open(CONFIG,"$ENV{TPMS_EOD_ETC}/etc.profile");
while(<CONFIG>){
my($key,$value)=split('=',$_);
if(uc($key) eq uc($name)){
$str = CITIC::strimstr($value);
chomp $str;
}else{
next;
}
}
close(CONFIG);
return uc($str);
}
#cmd
sub cmd {
my $ret;
my ( $script, $argv, $tablename, $dbh ) = @_;
my $cmd = " perl ${script} $argv";
my $rc = open( INFO, "$cmd 2>&1|" );
unless ($rc) {
CITIC::showtime();
print "Can't invoke the Command!\n";
return 1;
}
while (<INFO>) {
print $_;
#print STDOUT $_;
if (eof) {
unless (/\b(complete|Succeeds)/) {
CITIC::showtime();
print "*" x 6 . "$tablename作业执行失败" . "*" x 6 . "\n";
$ret = 1;
}
else {
CITIC::showtime();
print "*" x 6 . "$tablename作业执行成功" . "*" x 6 . "\n";
$ret = 0;
}
}
}
close(INFO);
return $ret;
}
#update job info
sub upJobInfo {
my ( $dbh, $tablename, $flag, $final ) = @_;
my $upstr;
my $timestamp = showtime();
if ( $flag == 1 ) {
$upstr =
"START_TIME=to_timestamp('$timestamp','YYYY-MM-DD hh24:mi:ss:ff'),TX_DATE=to_date('$tx_date','YYYY-MM-DD')";
}
else {
$upstr =
"END_TIME=to_timestamp('$timestamp','YYYY-MM-DD hh24:mi:ss:ff'),FLAG=$final";
}
my $str =
"update tpms_eod.T_TPMS_EODTABLE set $upstr where TABLE_NAME='$tablename' and SYSTEM='$system'";
my $sth;
eval {
$sth = $dbh->prepare($str);
$sth->execute();
};
if ($@) {
CITIC::showtime();
print "An error occurred ($@)\n";
CITIC::showtime();
print $dbh->errstr . "\n";
$dbh->disconnect();
return 1;
}
return 0;
}
#get tx_date
sub getTxdate {
my ($dbh) = @_;
my $txdate;
my $str =
"select to_char(CURR_BIZ_DATE,'YYYY-MM-DD') from tpms_eod.Tpms_Rollback_Bizdate";
my $sth;
eval {
$sth = $dbh->prepare($str);
$sth->execute();
};
if ($@) {
CITIC::showtime();
print "An error occurred ($@)\n";
CITIC::showtime();
print $dbh->errstr . "\n";
$dbh->disconnect();
return 1;
}
my $table = $sth->fetchall_arrayref();
$txdate = $table->[0][0];
#$dbh->disconnect();
return $txdate;
}
#get timestamp
sub showtime {
my ( $sec, $min, $hour, $day, $mon, $year ) = localtime( time() );
my $current = "";
$sec = sprintf( "%02d", $sec );
$min = sprintf( "%02d", $min );
$hour = sprintf( "%02d", $hour );
$day = sprintf( "%02d", $day );
$mon = sprintf( "%02d", $mon + 1 );
$year += 1900;
$current = " $year-$mon-$day" . " $hour" . ":$min" . ":$sec";
return ${current};
}
#execute eod job
sub executeJob {
my ( $dbh, %hash ) = @_;
my $i;
my $num = scalar( keys %hash );
for my $jobname ( keys %hash ) {
CITIC::showtime();
print "*" x 6 . "正在执行$jobname作业" . "*" x 6 . "\n";
upJobInfo( $dbh, $jobname, 1 );
$i++;
$num--;
eval {
$threads{$jobname} = Thread->new(
\&cmd,
$hash{$jobname}{'JOB_SCRIPT'},
$hash{$jobname}{'ARGV'}, $jobname
);
#->join();
};
if ($@) {
CITIC::showtime();
print "An error occurred ($@)\n";
return 1;
}
if ( $i > $maxnum - 1 ) {
print "进程达到最大数" . Thread->list() . "!!!\n";
while (1) {
for my $th ( Thread->list() ) {
my $tid;
if ( $th->done ) {
eval { $tid = $th->join() };
foreach my $tb ( keys %threads ) {
if ( $threads{$tb}->tid() == $th->tid() ) {
if ($tid) {
upJobInfo( $dbh, $tb, 2, 1 );
}
else {
upJobInfo( $dbh, $tb, 2, 0 );
}
}
}
$i--;
}
else {
next;
}
}
if ( Thread->list() < $maxnum ) {
print "进程小于3,开始新的进程\n";
last;
}
else {
print "sleep 10s,waiting for the job finish\n";
sleep 10;
}
}
}
if ( $num == 0 ) {
print "#" x 20
. "所有作业调度完成,等待进程结束!!!"
. "#" x 20 . "\n";
for my $th1 ( Thread->list() ) {
my $tid1;
eval { $tid1 = $th1->join() };
foreach my $tb1 ( keys %threads ) {
if ( $threads{$tb1}->tid() == $th1->tid() ) {
if ($tid1) {
upJobInfo( $dbh, $tb1, 2, 1 );
}
else {
upJobInfo( $dbh, $tb1, 2, 0 );
}
}
}
}
}
}
}
#程序入口
sub main {
#my ($system)=@_;
my $ret = 0;
my $dbh;
%dbc_info = CITIC::get_dbc_info($TPMS_EOD_SID);
unless (%dbc_info) {
CITIC::showtime();
print "Failed to get database information!\n";
}
else {
$dbh = CITIC::connect_db(
$dbc_info{"ip"}, $dbc_info{"port"}, $dbc_info{"sid"},
$dbc_info{"user"}, $dbc_info{"pwd"}
);
}
unless ($dbh) {
$ret = 1;
}
else {
my %jobinfo = getEodJob( $system, $dbh );
if (%jobinfo) {
if ( getTxdate($dbh) eq 1 ) {
$ret = 1;
}
else {
$tx_date = getTxdate($dbh);
executeJob( $dbh, %jobinfo );
}
}
else {
CITIC::showtime();
print "没有要执行的JOB,请确认后再执行!\n";
$ret = 1;
}
# $ret = excute_sql( $dbh, @sql_queue );
}
return $ret;
}
open( STDERR, ">&STDOUT" );
#if ( $#ARGV < 0 ) {
# print "Please input parameters,for example:\n1.system id :CTS\n";
# exit(1);
#}
#$system = uc( $ARGV[0] );
my $ret = main();
if ( $ret == 0 ) {
print STDOUT "complete\n";
}
else {
print STDOUT "fail\n";
# CITIC::send_mail(
# "[$my_sysenv] $log_name JOB FAILED",
#"Hi all,\n Job $log_name failed. Please see attached log file for details.\nthanks!"
# );
}
exit($ret);
END {
CITIC::showtime();
print "return code is $ret\n";
CITIC::close_logfile($log_file);
}
转载于:https://my.oschina.net/suzm/blog/475758