perl 多線程,即時監控線程數,支援max thread

來源:互聯網
上載者:User

標籤:

#!/usr/bin/perl -w#Description:rerun eod job group by system#Auther:Suzm#Date  :2015-06-23use 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 hashsub 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 ainner join tpms_eod.Tpms_Rollback_Bizdate bon a.TX_DATE != b.CURR_BIZ_DATEor (a.TX_DATE = b.CURR_BIZ_DATE and a.FLAG=1)where a.SYSTEM=‘${sysid}‘EOFmy $sth;eval {$sth = $dbh->prepare($str);$sth->execute();};if ([email protected]) {CITIC::showtime();print "An error occurred ([email protected])\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);}#cmdsub 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 infosub 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 ([email protected]) {CITIC::showtime();print "An error occurred ([email protected])\n";CITIC::showtime();print $dbh->errstr . "\n";$dbh->disconnect();return 1;}return 0;}#get tx_datesub 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 ([email protected]) {CITIC::showtime();print "An error occurred ([email protected])\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 timestampsub 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 jobsub 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 ([email protected]) {CITIC::showtime();print "An error occurred ([email protected])\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)[email protected]_;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);}


perl 多線程,即時監控線程數,支援max thread

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.