f 第一隻用在實務管理上的Perl 程式 ~ 迪貝之家

Pages

第一隻用在實務管理上的Perl 程式

延續Oracle 非最高權限怎麼砍session ,就算開發了讓AP自行砍SESSION的程式給他們來使用,還是會碰到session status是KILLED, 但會因為dblink等不到對方回應的狀況下,Oracle RDBMS沒辦法把server process 釋放掉,而造成process逐步累積後,最終達到參數檔裡頭processes 參數值的上線,導致無法連線,發生障礙而影響到業務。所以我用Perl 寫了一隻清理process的程式,它是被包在底下的shell script裡頭的,因為我要先把相關資料透過sqlplus 拋出,然後用Perl 強而有力的regex找出process id ,然後由Perl來呼叫系統指令kill -9 來砍process





PROCESS_FILE=/tmp/$ORACLE_SID.$EXEC_TIME

sqlplus "/ as sysdba" << !>$PROCESS_FILE

SET sqlprompt ''

SET sqlnumber off

SET verify off

SET pages 0

SET echo off

SET feedback off

SET feed off

select 'a' from dual;

select spid, program from v\$process

where program!= 'PSEUDO'

and addr not in (select paddr from v\$session)

and addr not in (select paddr from v\$bgprocess)

and addr not in (select paddr from v\$shared_server);

exit

!

perl clear_process.pl $PROCESS_FILE



底下perl 的程式碼,夠簡單了吧~~

這就是它regex強悍的地方

如果用shell script來寫,我可能得想破腦袋



use strict;

use warnings;

my $filename = shift;

open(my $fh, '<', $filename) or die "Could not open file '$filename' $!"; while (my $row = <$fh>) {

chomp $row;

if ($row =~ /^\d/ ) {

my @line = split /\s* /, $row;

if ( not defined $line[2] )

{

print "$line[0] ,$line[1] \n";

my $cmd = "kill -9 $line[0]";

system($cmd);

sleep(1);

}

}

}