延續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);
}
}
}