cada DB, dado que si tenemos varias DB es complicado determinar que
segmento pertenece a cada una.
Salida:
El comando muestra la misma salida del "ipcs -m" pero añade al final
de cada segmento de memoria la DB correspondiente y completa con "*"
cuando el segmento no esta referenciado con ninguna DB, lo cual nos
facilita un segmento candidato a ser eliminado con el comando "ipcrm -
m [ID]".
Nota:
Es importante solo tener en cuenta los segmentos de los usuarios de
las DB (Ej. Oracle)
Ejemplo:
root@tango01 # showipcs
IPC status from
T ID KEY MODE OWNER GROUP
Shared Memory:
m 84 0x6c91c3e0 --rw-r----- oracle dba
[ ****************** ]
m 74 0x83a50bf0 --rw-r----- oracle dba [ DNWTPRO ]
m 44 0xcea2dc58 --rw-r----- oracle dba [ DNEWTOUR ]
m 30 0xb60abb4c --rw-r----- oracle dba [ DPRTLEMP ]
m 7 0x438d0000 --rw-r----- oracle dba [ DVGNT ]
m 1 0xfa9d2b30 --rw-r----- oracle dba [ DGFORCE ]
En esta salida de ejemplo el segmento 84 presuntamente esta asignado
pero no pertenece a ninguna DB activa, con lo cual tendría que ser
eliminado con el comando "ipcrm -m 84"
SCRIPT:
#!/usr/bin/perl
sub ipc2db{
$p_ipc = shift;
@PMONPID=`ps -ef|grep pmon|grep -v grep|awk '{print \$2}'`;
foreach $pid (@PMONPID) {
$db="";
$ipc="";
chomp($pid);
$db=`ps -ef -o "comm,pid" |grep -i " $pid"|grep -v
grep|awk '{print \$1}'|cut -d"_" -f3`;
chomp($db);
$ipc=`pmap $pid |egrep shmid|cut -d "=" -f2|awk
'{print \$1"=d"}'`;
chomp($ipc);
$ipc=hex($ipc);
return($db) if("$p_ipc" == "$ipc");
}
}
@IPCS_M=`/usr/bin/ipcs -m`;
foreach $line (@IPCS_M){
$DB="";
chomp($line);
if($line =~ m/^m/){
($T,$ID,$KEY,$MODE,$OWNER,$GROUP) = split(/\ +/,$line,
6);
$DB = ipc2db("$ID");
$DB=($DB?$DB:"******************");
print $line." [ $DB ]\n";
}else{
print $line."\n";
}
}
##END
Gracias a MarcosG
Salu2,
Mariano
No hay comentarios:
Publicar un comentario