1 Host time syncronization
Create a file named sys_timesync.sh in the /CONFIG/SCRIPTS directory:
cat > sys_timesync.sh
And paste the folllowing code:
#!/bin/sh # =========================================================================== # Este documento contiene datos propiedad intelectual de DEISTER # S.A. Este documento no puede ser publicado, copiado o cedido # total o parcialmente sin permiso escrito de DEISTER S.A. # # Al utilizar este software, usted reconoce y concuerda que su uso # es bajo su responsabilidad y que ninguna de las partes involucradas # en la creación, producción o prestación del servicio es responsable # de cualquier perjuicio directo, incidental, consecuente, indirecto # o punitivo o de pérdida, costo o gasto alguno (incluyendo honorarios # legales, honorarios de peritos u otro desembolso) que pueda surgir # directa o indirectamente a través de su uso, incluyendo pero no # limitado a lo causado por virus, defectos, acción humana o inacción # del sistema informático, línea telefónica, hardware, software o errores # en el programa. # # sys_timesync.sh: Sincroniza la hora con un servidor de tiempo NTP o rdate # # Linux RPM: intimed - Servidor rdate # rdate - Cliente rdate # ntp - Cliente NTP sincronizacion internacional # Para activar intimed: chkconfig time on; service xinetd restart # ------------------------------------------------ # Algunos servidores NTP: # pool.ntp.org # # Comandos NTP # ntpq -c pee 129.127.28.4 # busca una lista de servidores # =========================================================================== STATUS=OK MOTIVE="" LOGSYS=/usr/tmp/`basename $0 .sh`.`date +%w`.log # Usage message. usage () { STATUS=ERROR MOTIVE="Usage: `basename $0` ---timeserver <host> \| --ntpserver <host> \ [--mailto <"user1@domain.es,user2@domain.es,...">] \ [--mailerror <"user1@domain.es,user2@domain.es,...">]" echo >> $LOGSYS echo "Error: $1" >> $LOGSYS echo >> $LOGSYS echo $MOTIVE >> $LOGSYS exit 1 } #send email do_mail () { cat -v $LOGSYS | mail -s "$STATUS `basename $0` at `date`" -r `hostname` $1 } # ************************************************************************ # # Main # # ************************************************************************ echo "#% " >$LOGSYS echo "#% START" >>$LOGSYS echo "#% name: `basename $0 .sh`" >>$LOGSYS echo "#% desc: Sinchronize time with server" >>$LOGSYS echo "#% " >>$LOGSYS echo "#% host: `uname -n`" >>$LOGSYS echo "#% date: `date +%d-%m-%Y`" >>$LOGSYS echo "#% time: `date +%H:%M`" >>$LOGSYS echo "#% " >>$LOGSYS echo " " >>$LOGSYS # ------------------------------------------------------------------- # Parse and verify arguments # ------------------------------------------------------------------- echo "Arguments:" >> $LOGSYS echo $* >> $LOGSYS echo >> $LOGSYS echo >> $LOGSYS if [ $# -eq 0 ]; then usage "missing arguments" fi while echo $1 | grep ^- > /dev/null; do case $1 in --mailto|--mailerror|--timeserver|--ntpserver) eval $( echo $1 | tr 'a-z' 'A-Z' | sed 's/-//g' | tr -d '\012')=\$2;; --) break;; -*) usage "unknown argument: $1";; *) break;; esac shift shift done if [ -z $TIMESERVER ] && [ -z $NTPSERVER ]; then usage "missing argument --timeserver | --ntpserver" fi if [ -n "$TIMESERVER" ]; then echo "Using rdate $TIMESERVER" >>$LOGSYS if [ `uname -s` = "Linux" ]; then rdate -s $TIMESERVER >> $LOGSYS 2>&1 fi if [ `uname -s` != "Linux" ]; then rdate $TIMESERVER >> $LOGSYS 2>&1 fi if [ $? -gt 0 ]; then STATUS=ERROR echo "`date` ***** ERROR sys_timesync en rdate $TIMESERVER" >>$LOGSYS fi fi if [ -n "$NTPSERVER" ]; then if [ -x /usr/sbin/ntpdate ]; then echo "Using ntpdate $NTPSERVER" >>$LOGSYS /usr/sbin/ntpdate -b -u -t 30 $NTPSERVER >>$LOGSYS 2>&1 # `cat /etc/ntp/step-tickers` if [ $? -gt 0 ]; then STATUS=ERROR echo "`date` ***** ERROR sys_timesync $NTPSERVER $TIMESERVER" >>$LOGSYS fi else STATUS=ERROR echo "`date` ***** ERROR sys_timesync ntp client not found" >>$LOGSYS fi fi echo "" >>$LOGSYS echo "#% status: $STATUS" >>$LOGSYS echo "#% motive: $MOTIVE" >>$LOGSYS echo "#% enddate: `date +%d-%m-%Y`" >>$LOGSYS echo "#% endtime: `date +%H:%M`" >>$LOGSYS echo "" >>$LOGSYS echo "END $STATUS `basename $0 .sh` `date` " >>$LOGSYS echo "======================================================" >>$LOGSYS # ************************************************************************ # We send the result of the process to the administrator via e-mail. # In this way we make sure that the administrator always knows # if the process is executed correctly or not. # For this you have to make sure that the equipment can do mail relay. # ************************************************************************ if [ -n "$MAILTO" ]; then do_mail $MAILTO fi if [ -n "$MAILERROR" ] && [ "$STATUS" != "OK" ]; then do_mail $MAILERROR fi # END sys_timesync
Give it execution permissions:
chmod +x sys_timesync.sh
Finally add the root crontab in the following execution:
crontab -e
00 2 * * * /CONFIG/SCRIPTS/sys_timesync.sh --ntpserver es.pool.ntp.org
2 OS verification
Create a file named sys_checkos.sh in the /CONFIG/SCRIPTS directory
cat > sys_checkos.sh
And paste the following code:
#!/bin/sh # =========================================================================== # Este documento contiene datos propiedad intelectual de DEISTER # S.A. Este documento no puede ser publicado, copiado o cedido # total o parcialmente sin permiso escrito de DEISTER S.A. # # Al utilizar este software, usted reconoce y concuerda que su uso # es bajo su responsabilidad y que ninguna de las partes involucradas # en la creación, producción o prestación del servicio es responsable # de cualquier perjuicio directo, incidental, consecuente, indirecto # o punitivo o de pérdida, costo o gasto alguno (incluyendo honorarios # legales, honorarios de peritos u otro desembolso) que pueda surgir # directa o indirectamente a través de su uso, incluyendo pero no # limitado a lo causado por virus, defectos, acción humana o inacción # del sistema informático, línea telefónica, hardware, software o errores # en el programa. # # description: Operaint System check # processname: sys_checkos.sh # # =========================================================================== INFORMIXDIR=${INFORMIXDIR:-`grep "^informix:" /etc/passwd | awk -F: '{ print $6 }'`} INFORMIXSERVER=${INFORMIXSERVER:-`uname -n|awk -F'.' '{print $1}'`} DB_LOCALE=${DB_LOCALE:-es_es.8859-1} CLIENT_LOCALE=${CLIENT_LOCALE:-es_es.8859-1} DBDATE=${DBDATE:-DMY4-} export INFORMIXDIR INFORMIXSERVER DB_LOCALE CLIENT_LOCALE DBDATE STATUS=OK MOTIVE="" LOGSYS=/usr/tmp/`basename $0 .sh`.`date +%w`.log [ `uname -s` = "SunOS" ] && MAIL=mailx || MAIL=mail PCTFULL=80 EXCLUDEDISKS="\"\"" # Usage message. usage () { echo echo Usage: $0 [--purgewic days] echo [--mailto \"user1@domain.es user2@domain.es\"] echo [--mailerror \"user1@domain.es user2@domain.es\"] echo echo --mailto addresses to send email always echo --mailerror addresses to send email if error occurs echo --pctfull threshold percentage of disk occupation \(default 80%\) echo --excludedisks list of partitions to exclude of check echo echo Example: $0 --mailerror \"addr1@domain.com addr2@domain.com\" echo Example: $0 --pctfull 85 --excludedisks \"\(ifmx\)\" echo Example: $0 --excludedisks \"\(ssd\|ifmx\)\" echo exit } ####################################################### # Main # Analize the parameters to exceed the default values while : do case $1 in --mailto) shift; MAILTO=$1; shift;; --mailerror) shift; MAILERROR=$1; shift;; --pctfull) shift; PCTFULL=$1; shift;; --excludedisks) shift; EXCLUDEDISKS=$1; shift;; --) shift; break;; -*) usage;; *) break;; esac done # ************************************************************************ # # SPECIFIC OPERATING SYSTEM AND DATABASE FUNCTIONS # # do_AIX # do_HPUX # do_LINUX # do_SOLARIS # # ************************************************************************ do_AIX() { find /home \( -name core -o -name a.out -o -name '*%' \) \ -print -exec rm -f '{}' \; > /dev/null # AIX Volume Manager # AIX Disk Arrays for DISK in `lsdev -Ctarray -s fdar -F name`; do if [ `fraidmgr -C -l $DISK | head -n 1 | grep -v -c "OPTIMAL"` -gt 0 ]; then STATUS=ERROR echo "`date` ***** ERROR en RAID en disco físico $DISK" >>$LOGSYS fraidmgr -C -l $DISK >>$LOGSYS # else # echo "$DISK OK" >>$LOGSYS fi done # Filesystems free space echo "Verificando espacio libre en filesystems..." >>$LOGSYS df -k | sed '1d' | sed 's/%/ /g' | awk '{ if ($4 > $PCTFULL ) \ printf("FILESYSTEM %s with %d%% occupation\n", $7, $4) }' > /tmp/checkos_df.tmp if [ -s /tmp/checkos_df.tmp ]; then STATUS=ERROR cat /tmp/checkos_df.tmp >>$LOGSYS fi rm -f /tmp/checkos_df.tmp } do_HPUX() { find / \( -name core -o -name a.out -o -name '*%' \) \ -print -exec rm -f '{}' \; > /dev/null } do_LINUX() { #echo "Deleting files core.*, a.out in /home and /root" >> $LOGSYS # Deleting files core.*, a.out in /home and /root #Bug elimina el fichero /home/gsutil/third_party/rsa/rsa/core.py #find /home \( -name 'core.*' -o -name a.out -o -name '*%' \) \ # -print -exec rm -f '{}' \; > /dev/null # Deleting files core.*, a.log in /root not modifies in 15 days #Bug elimina el fichero /home/gsutil/third_party/rsa/rsa/core.py #find /root \( -name 'core.*' -o -name '*.log' \) -mtime +15 \ # -print -exec rm -f '{}' \; > /dev/null # Check if Linux RAID is OK #if [ -f /proc/mdstat ]; then # echo "Verificando RAID software de Linux" >> $LOGSYS # if [ `cat /proc/mdstat | grep "\[" | grep -c "_"` -gt 0 ]; then # STATUS=ERROR # echo "`date` ***** ERROR en RAID /proc/mdstat" >>$LOGSYS # cat /proc/mdstat >>$LOGSYS # fi #fi # Filesystems free space echo "Checking free space in filesystem. Threshold occupation in ${PCTFULL}%..." >>$LOGSYS df -k | sed '1d' | sed 's/%/ /g' | awk '{ if ($5 > '$PCTFULL' && $6 !~ /'$EXCLUDEDISKS'/) \ printf("FILESYSTEM %s with %d%% occupation\n", $6, $5,'$PCTFULL') }' > /tmp/checkos_df.tmp if [ -s /tmp/checkos_df.tmp ]; then STATUS=ERROR cat /tmp/checkos_df.tmp >>$LOGSYS fi rm -f /tmp/checkos_df.tmp } do_SOLARIS() { # Delete core files, a.out y % de / find / \( -name core -o -name a.out -o -name '*%' \) \ -print -exec rm -f '{}' \; > /dev/null # Delete recovery files from vi find /var/preserve \( -name 'Ex*' \) -atime +3 \ -print -exec rm '{}' \; > /dev/null # Keep reduced the log files cat /dev/null > /var/adm/wtmp cat /dev/null > /var/adm/wtmpx cat /dev/null > /var/adm/sulog cat /dev/null > /var/adm/lastlog # Solaris DiskSuite if [ -f /usr/sbin/metastat ]; then if [ `/usr/sbin/metastat | grep -c "esync"` -gt 0 ]; then STATUS=ERROR echo "`date` ***** ERROR en RAID /usr/sbin/metastat" >>$LOGSYS /usr/sbin/metastat >>$LOGSYS fi fi # Veritas volume manager if [ -f /usr/sbin/vxprint ]; then # Veritas Volume Manager if [ `/usr/sbin/vxprint -v | grep "v" | grep -v -c "ACTIVE"` -gt 0 ]; then STATUS=ERROR echo "`date` ***** ERROR en RAID /usr/sbin/vxprint -v" >>$LOGSYS /usr/sbin/vxprint -v >> $LOGSYS fi fi # Filesystems free space echo "Verificando espacio libre en filesystems..." >>$LOGSYS df -k | sed '1d' | sed 's/%/ /g' | awk '{ if ($5 > $PCTFULL ) \ printf("FILESYSTEM %s with %d%% occupation\n", $6, $5) }' > /tmp/checkos_df.tmp if [ -s /tmp/checkos_df.tmp ]; then STATUS=ERROR cat /tmp/checkos_df.tmp >>$LOGSYS fi rm -f /tmp/checkos_df.tmp } do_SAI() { echo "" >> $LOGSYS if [ ! -d /bin/PowerChute -a ! -d /usr/local/bin/PowerChute ]; then echo "" >>$LOGSYS echo "SAI PowerChute no instalado en este equipo." >>$LOGSYS return else if [ -d /bin/PowerChute ]; then POWERCHUTEHOME=/bin/PowerChute fi if [ -d /usr/local/bin/PowerChute ]; then POWERCHUTEHOME=/usr/local/bin/PowerChute fi PCNSID=`cat $POWERCHUTEHOME/pcns.pid` if [ `ps -p $PCNSID | grep -c "java"` -eq 0 ]; then echo "=========================================" >>$LOGSYS echo "ERROR: SAI PowerChute no esta funcionando" >>$LOGSYS echo "Modifique el fichero ${POWERCHUTEHOME}/powerchute.sh para que el path" >>$LOGSYS echo "de ejecución de java sea /usr/bin/java y cree un link de dicho fichero" >>$LOGSYS echo "al path real de su instalación." >>$LOGSYS echo "=========================================" >>$LOGSYS STATUS=ERROR else echo "SAI PowerChute ejecutandose correctamente" >>$LOGSYS fi fi } # ************************************************************************ # # Determines the operating system and executes the dependent code # # ************************************************************************ # We didn't use rm -f $LOGSYS to use LOGSYS=/dev/tty echo "#% " >$LOGSYS echo "#% START" >>$LOGSYS echo "#% name: `basename $0 .sh`" >>$LOGSYS echo "#% desc: Check O.S. status" >>$LOGSYS echo "#% " >>$LOGSYS echo "#% host: `uname -n`" >>$LOGSYS echo "#% date: `date +%d-%m-%Y`" >>$LOGSYS echo "#% time: `date +%H:%M`" >>$LOGSYS echo "#% " >>$LOGSYS echo " " >>$LOGSYS if [ "`uname -s`" = "AIX" ]; then do_AIX elif [ "`uname -s`" = "Linux" ]; then do_LINUX elif [ "`uname -s`" = "HP-UX" ]; then do_HPUX elif [ "`uname -s`" = "SunOS" ]; then do_SOLARIS else status=ERROR echo "ERROR: Unknown OS `uname -s`" >>$LOGSYS fi #do_SAI echo "" >>$LOGSYS echo "#% status: $STATUS" >>$LOGSYS echo "#% motive: $MOTIVE" >>$LOGSYS echo "#% enddate: `date +%d-%m-%Y`" >>$LOGSYS echo "#% endtime: `date +%H:%M`" >>$LOGSYS echo "" >>$LOGSYS echo "END $STATUS `basename $0 .sh` `date` " >>$LOGSYS echo "======================================================" >>$LOGSYS # ************************************************************************ # We send the result of the process to the administrator via e-mail. # In this way we make sure that the administrator always knows # if the process is executed correctly or not. # For this you have to make sure that the equipment can do mail relay. # ************************************************************************ if [ -n "$MAILTO" ]; then $MAIL -s "$STATUS sys_checkos at `uname -n` `date`" $MAILTO < $LOGSYS fi if [ -n "$MAILERROR" ] && [ "$STATUS" != "OK" ]; then $MAIL -s "$STATUS sys_checkos at `uname -n` `date`" $MAILERROR < $LOGSYS fi # END sys_checkos
Give it execution permissions:
chmod +x sys_checkos.sh
Finally add the root crontab in the following execution:
crontab -e
15 4 * * * /CONFIG/SCRIPTS/sys_checkos.sh
3 OS configuration Backup
Create a file named sys_cfgsave.sh in the /CONFIG/SCRIPTS directory
cat > sys_cfgsave.sh
And paste the following code:
#!/bin/sh # ===================================================================== # Este documento contiene datos propiedad intelectual de DEISTER # S.A. Este documento no puede ser publicado, copiado o cedido # total o parcialmente sin permiso escrito de DEISTER S.A. # # Al utilizar este software, usted reconoce y concuerda que su uso # es bajo su responsabilidad y que ninguna de las partes involucradas # en la creación, producción o prestación del servicio es responsable # de cualquier perjuicio directo, incidental, consecuente, indirecto # o punitivo o de pérdida, costo o gasto alguno (incluyendo honorarios # legales, honorarios de peritos u otro desembolso) que pueda surgir # directa o indirectamente a través de su uso, incluyendo pero no # limitado a lo causado por virus, defectos, acción humana o inacción # del sistema informático, línea telefónica, hardware, software o errores # en el programa. # # description: Crea un tar de los ficheros de configuracion del sistema # processname: sys_cfgsave.sh # ====================================================================== INFORMIXDIR=${INFORMIXDIR:-`grep "^informix:" /etc/passwd | awk -F: '{ print $6 }'`} INFORMIXSERVER=${INFORMIXSERVER:-`uname -n|awk -F'.' '{print $1}'`} export INFORMIXDIR INFORMIXSERVER STATUS=OK MOTIVE="" LOGSYS=/usr/tmp/`basename $0 .sh`.`date +%w`.log HOSTNAME=`uname -n|awk -F'.' '{print $1}'` # Usage message. usage () { STATUS=ERROR MOTIVE="Usage: `basename $0` --dirsave <path-dir> \ [--mailto <"user1@domain.es,user2@domain.es,...">] \ [--mailerror <"user1@domain.es,user2@domain.es,...">]" echo >> $LOGSYS echo "Error: $1" >> $LOGSYS echo >> $LOGSYS echo $MOTIVE >> $LOGSYS exit 1 } #send email do_mail () { cat -v $LOGSYS | mail -s "$STATUS `basename $0` at `date`" -r `hostname` $1 } # ************************************************************************ # # SPECIFIC OPERATING SYSTEM AND DATABASE FUNCTIONS # # do_LINUX # do_INFORMIX # ************************************************************************ do_LINUX() { echo "=== System Filesystem mounts ===" >> $OS_INFO df -k >> $OS_INFO echo >> $OS_INFO echo "=== System Disk structures ===" >> $OS_INFO /sbin/fdisk -l >> $OS_INFO echo >> $OS_INFO echo "=== Network Configuration ===" >> $OS_INFO /sbin/ifconfig -a >> $OS_INFO echo >> $OS_INFO echo "=== Routing Configuration ===" >> $OS_INFO netstat -r >> $OS_INFO echo >> $OS_INFO echo "=== Cron Root User ===" >> $OS_INFO crontab -l >> $OS_INFO echo >> $OS_INFO # We perform a tar of the critical system files tar chf $OS_FILE \ /etc/rc.d/init.d/informix \ /etc/hosts \ /etc/hosts.equiv \ /etc/passwd \ /etc/group \ /etc/shadow \ /etc/gshadow \ /etc/sysctl.conf \ /etc/rsyncd.conf \ /etc/dhcpd.* \ /etc/ldap.* \ /etc/lilo.conf \ /etc/named.conf \ /etc/resolv.conf \ /etc/nsswitch.conf \ /etc/proftpd.conf \ /etc/modules.conf \ /etc/rndc.conf \ /etc/exports \ /etc/fstab \ /etc/cups \ /etc/cvs \ /etc/lvm \ /etc/openldap \ /etc/procmailrc \ /etc/postfix \ /etc/postfix/aliases \ /etc/raidtab \ /etc/htdig/*.conf \ /etc/httpd/conf/*.conf \ /etc/samba* \ /etc/skel \ /etc/squid \ /etc/sysconfig \ /etc/fetchmailrc \ /usr/share/vim/vimrc \ /usr/share/vim/vimrc_example.vim \ /var/named \ /var/spool/cron \ /var/lib/samba \ 2>/dev/null } do_INFORMIX() { if [ -d /INFORMIXDEV ]; then echo "=== Informix /INFORMIXDEV links ===" >> $DB_INFO ls -l /INFORMIXDEV >> $DB_INFO echo >> $DB_INFO fi if [ -d $INFORMIXDIR/etc/sqlhosts ]; then echo "=== Informix etc/sqlhosts ===" >> $DB_INFO cat $INFORMIXDIR/etc/sqlhosts >> $DB_INFO echo >> $DB_INFO fi if [ -x $INFORMIXDIR/bin/onstat ]; then echo "=== Informix onstat -d ===" >> $DB_INFO $INFORMIXDIR/bin/onstat -d >> $DB_INFO echo >> $DB_INFO echo "=== Informix onstat -a ===" >> $DB_INFO $INFORMIXDIR/bin/onstat -a >> $DB_INFO echo >> $DB_INFO fi # Realizamos un tar de los ficheros criticos de BB.DD. tar cf $DB_FILE \ $INFORMIXDIR/.profile \ $INFORMIXDIR/.login \ $INFORMIXDIR/etc/onconfig* \ $INFORMIXDIR/etc/sqlhosts \ $INFORMIXDIR/etc/*.sh \ 2>/dev/null } # ************************************************************************ # # Main # # ************************************************************************ echo "#% " >$LOGSYS echo "#% START" >>$LOGSYS echo "#% name: `basename $0 .sh`" >>$LOGSYS echo "#% desc: Save critical config files to tar archive" >>$LOGSYS echo "#% " >>$LOGSYS echo "#% host: `uname -n`" >>$LOGSYS echo "#% date: `date +%d-%m-%Y`" >>$LOGSYS echo "#% time: `date +%H:%M`" >>$LOGSYS echo "#% " >>$LOGSYS echo " " >>$LOGSYS # ------------------------------------------------------------------- # Parse and verify arguments # ------------------------------------------------------------------- echo "Arguments:" >> $LOGSYS echo $* >> $LOGSYS echo >> $LOGSYS echo >> $LOGSYS # Parameters required if [ $# -eq 0 ]; then usage fi while echo $1 | grep ^- > /dev/null; do case $1 in --mailto|--mailerror|--dirsave) eval $( echo $1 | tr 'a-z' 'A-Z' | sed 's/-//g' | tr -d '\012')=\$2;; --) break;; -*) usage "unknown argument: $1";; *) break;; esac shift shift done #Required params REQPARAMS=( dirsave ) for PARAM in "${REQPARAMS[@]}" ; do arg=`echo $PARAM | tr 'a-z' 'A-Z'` if [ -z ${!arg} ]; then usage "missing argument --$PARAM" fi done # ************************************************************************ # # DEFINE DATA EXIT VARIABLES # # ************************************************************************ # Almacena un tar con los ficheros y datos criticos del agente de base de datos DB_FILE=/usr/tmp/sys_cfgsave.db_files.tar # Almacena un tar dependiente de sistema con los ficheros criticos OS_FILE=/usr/tmp/sys_cfgsave.os_files.tar # Almacena el texto de informacion de BB.DD. DB_INFO=/usr/tmp/sys_cfgsave.db_info.txt # Almacena el texto de informacion del sistema OS_INFO=/usr/tmp/sys_cfgsave.os_info.txt rm -f $OS_INFO $DB_INFO touch $OS_INFO $DB_INFO # Verifica que existe el directorio de backup if [ ! -d $DIRSAVE ]; then mkdir -p $DIRSAVE fi # ************************************************************************ # # Determines the operating system and executes the dependent code # # ************************************************************************ if [ "`uname -s`" = "Linux" ]; then do_LINUX else echo "ERROR: Unknown OS `uname -s`" >>$LOGSYS fi do_INFORMIX # ************************************************************************ # # Stores the files in a tar file # # ************************************************************************ FILES="/CONFIG $OS_INFO $DB_INFO $OS_FILE $DB_FILE" echo "" >> $LOGSYS echo "tar cf $DIRSAVE/Config.$HOSTNAME.`date '+%w'`.tar.gz $FILES" >> $LOGSYS echo "" >> $LOGSYS tar cf - $FILES | gzip > $DIRSAVE/Config.$HOSTNAME.`date '+%w'`.tar.gz 2>/dev/null if [ $? -ne 0 ]; then STATUS=ERROR MOTIVE="Error ejecutando tar" fi ls -l $DIRSAVE/Config.$HOSTNAME.`date '+%w'`.tar.gz >> $LOGSYS rm -f $OS_INFO $DB_INFO $OS_FILE $DB_FILE echo "" >>$LOGSYS echo "#% status: $STATUS" >>$LOGSYS echo "#% motive: $MOTIVE" >>$LOGSYS echo "#% enddate: `date +%d-%m-%Y`" >>$LOGSYS echo "#% endtime: `date +%H:%M`" >>$LOGSYS echo "" >>$LOGSYS echo "END $STATUS `basename $0 .sh` `date` " >>$LOGSYS echo "======================================================" >>$LOGSYS # ************************************************************************ # We send the result of the process to the administrator via e-mail. # In this way we make sure that the administrator always knows # if the process is executed correctly or not. # For this you have to make sure that the equipment can do mail relay. # ************************************************************************ if [ -n "$MAILTO" ]; then do_mail $MAILTO fi if [ -n "$MAILERROR" ] && [ "$STATUS" != "OK" ]; then do_mail $MAILERROR fi # END sys_cfgsave
Give it execution permissions:
chmod +x sys_cfgsave.sh
Finally add the root crontab in the following execution:
crontab -e
00 1 * * * /CONFIG/SCRIPTS/sys_cfgsave.sh --dirsave /home/SYSCONFIG
4 Update statistics
Create a file named dbs_updstat.sh in the /CONFIG/SCRIPTS directory
cat > dbs_updstat.sh
And paste the following code:
#!/bin/sh # ====================================================================== # Este documento contiene datos propiedad intelectual de DEISTER # S.A. Este documento no puede ser publicado, copiado o cedido # total o parcialmente sin permiso escrito de DEISTER S.A. # # Al utilizar este software, usted reconoce y concuerda que su uso # es bajo su responsabilidad y que ninguna de las partes involucradas # en la creación, producción o prestación del servicio es responsable # de cualquier perjuicio directo, incidental, consecuente, indirecto # o punitivo o de pérdida, costo o gasto alguno (incluyendo honorarios # legales, honorarios de peritos u otro desembolso) que pueda surgir # directa o indirectamente a través de su uso, incluyendo pero no # limitado a lo causado por virus, defectos, acción humana o inacción # del sistema informático, línea telefónica, hardware, software o errores # en el programa. # # description: Realiza la actualización de estadísitcas del motor Informix # processname: dbs_updstat.sh # # $Id: dbs_updstat.sh $ # ====================================================================== INFORMIXDIR=${INFORMIXDIR:-`grep "^informix:" /etc/passwd | awk -F: '{ print $6 }'`} INFORMIXSERVER=${INFORMIXSERVER:-ol_`uname -n|awk -F'.' '{print $1}'`} DB_LOCALE=${DB_LOCALE:-es_es.8859-1} CLIENT_LOCALE=${CLIENT_LOCALE:-es_es.8859-1} DBDATE=${DBDATE:-DMY4-} export INFORMIXDIR INFORMIXSERVER DB_LOCALE CLIENT_LOCALE DBDATE STATUS=OK MOTIVE="" LOGSYS=/usr/tmp/`basename $0 .sh`.`date +%w`.log # Usage message. usage () { STATUS=ERROR MOTIVE="Usage: `basename $0` [--dbsexclude <"'db1','db2',...">] \ [--dbsinclude <"'db1','db2',...">] \ [--parallel] \ [--mailto <"user1@domain.es,user2@domain.es,...">] \ [--mailerror <"user1@domain.es,user2@domain.es,...">]" echo >> $LOGSYS echo "Error: $1" >> $LOGSYS echo >> $LOGSYS echo $MOTIVE >> $LOGSYS exit 1 } #send email do_mail () { cat -v $LOGSYS | mail -s "$STATUS `basename $0` at `date`" -r `hostname` $1 } # ************************************************************************ # # Main # # ************************************************************************ #Check log file is current day if [ -f $LOGSYS ]; then CHECKLOG=`find $LOGSYS -daystart -mtime -1 -print` if [ -z $CHECKLOG ]; then cat /dev/null > $LOGSYS fi fi echo "#% " >>$LOGSYS echo "#% START" >>$LOGSYS echo "#% name: `basename $0 .sh`" >>$LOGSYS echo "#% desc: Executes update statistics on databases" >>$LOGSYS echo "#% " >>$LOGSYS echo "#% host: `uname -n`" >>$LOGSYS echo "#% date: `date +%d-%m-%Y`" >>$LOGSYS echo "#% time: `date +%H:%M`" >>$LOGSYS echo "#% " >>$LOGSYS echo " " >>$LOGSYS # ------------------------------------------------------------------- # Parse and verify arguments # ------------------------------------------------------------------- echo "Arguments:" >> $LOGSYS echo $* >> $LOGSYS echo >> $LOGSYS echo >> $LOGSYS #default value DBSEXCLUDE="\"\"" while echo $1 | grep ^- > /dev/null; do case $1 in --mailto|--mailerror|--dbsexclude|--dbsinclude) eval $( echo $1 | tr 'a-z' 'A-Z' | sed 's/-//g' | tr -d '\012')=\$2;shift;shift;; --parallel) PARALLEL=Y;shift;; --) break;shift;shift;; -*) usage "unknown argument: $1";; *) break;shift;shift;; esac done # Obtiene la lista de las bases de datos a procesar if [ -z "$DBSINCLUDE" ]; then INCLCMD="1=1" DBSINCLUDE="\"\"" else INCLCMD="1=0" fi su informix -c "$INFORMIXDIR/bin/dbaccess sysmaster" >>$LOGSYS 2>>$LOGSYS <<EOF SET ISOLATION TO DIRTY READ; UNLOAD TO "/tmp/dbslist.$$" DELIMITER ' ' SELECT trim(name) || "/" || trim(dbs_collate) name FROM sysdatabases, OUTER sysdbslocale WHERE sysdatabases.name = sysdbslocale.dbs_dbsname AND name NOT MATCHES "sys*" AND name NOT IN ($DBSEXCLUDE) AND (name IN ($DBSINCLUDE) OR $INCLCMD) EOF if [ $? -gt 0 ]; then STATUS=ERROR echo "`date` ***** ERROR Obteniendo lista de bases de datos" >>$LOGSYS fi DBSLIST=`cat /tmp/dbslist.$$` rm -f /tmp/dbslist.$$ # ************************************************************************ # # For each database # # ************************************************************************ echo "SET OPTIMIZATION LOW; UPDATE STATISTICS LOW FORCE;" > /tmp/updstat.sql for DBSOBJ in `echo $DBSLIST | sed 's/name //g'`; do LOC=`basename $DBSOBJ` DBS=`dirname $DBSOBJ` if [ -z "$PARALLEL" ]; then echo "`date` Update statistics for [$DBS] with locale [$LOC]" >>$LOGSYS su informix -c "CLIENT_LOCALE=${LOC}; export CLIENT_LOCALE; DB_LOCALE=${LOC}; export DB_LOCALE; $INFORMIXDIR/bin/dbaccess $DBS /tmp/updstat.sql" >>$LOGSYS 2>&1 if [ $? -gt 0 ]; then STATUS=ERROR echo "***** ERROR UPDATE STATISTICS ON $DBS" >>$LOGSYS fi else ( \ echo "UPDATING STATISTICS FOR DATABASE $DBS WIDTH LOCALE $LOC" >/tmp/updstat_$DBS.log ; \ echo "=====================================" >>/tmp/updstat_$DBS.log ; \ su informix -c "CLIENT_LOCALE=${LOC}; export CLIENT_LOCALE; DB_LOCALE=${LOC}; export DB_LOCALE; $INFORMIXDIR/bin/dbaccess $DBS /tmp/updstat.sql" >>/tmp/updstat_$DBS.log 2>&1 ; \ if [ $? -gt 0 ]; then \ echo "***** ERROR UPDATE STATISTICS ON $DBS" >>/tmp/updstat_$DBS.log ; \ fi ; \ cat /tmp/updstat_$DBS.log >>$LOGSYS ; rm -f /tmp/updstat_$DBS.log; \ ) & BGPID=$! UNLOADPIDS="${UNLOADPIDS} ${BGPID}" fi done if [ -n "$PARALLEL" ]; then # Debemos esperar a que terminen todos los procesos background echo "waiting for proces to finish $UNLOADPIDS " >>$LOGSYS wait $UNLOADPIDS # Como el proceso se ejecuta en background, debemos verificar el error # al final... if [ `grep -c ERROR $LOGSYS` -gt 0 ]; then STATUS=ERROR fi fi rm -f /tmp/updstat.sql echo "" >>$LOGSYS echo "#% status: $STATUS" >>$LOGSYS echo "#% motive: $MOTIVE" >>$LOGSYS echo "#% enddate: `date +%d-%m-%Y`" >>$LOGSYS echo "#% endtime: `date +%H:%M`" >>$LOGSYS echo "" >>$LOGSYS echo "END $STATUS `basename $0 .sh` `date` " >>$LOGSYS echo "======================================================" >>$LOGSYS # ************************************************************************ # # Enviamos el resultado del proceso al administrador via e-mail. # De este modo nos aseguramos que el administrador siempre sabe # si el proceso se ejecuta correctamente o no. # Para ello hay que asegurase que el equipo puede hacer mail relay. # # ************************************************************************ if [ -n "$MAILTO" ]; then do_mail $MAILTO fi if [ -n "$MAILERROR" ] && [ "$STATUS" != "OK" ]; then do_mail $MAILERROR fi # END dbs_updstat
Darle permisos de ejecución:
chmod +x dbs_updstat.sh
Finally add the root crontab in the following execution:
crontab -e
00 4 * * * /CONFIG/SCRIPTS/dbs_updstat.sh
5 Database state verification
Create a file named dbs_oncheck.sh in the /CONFIG/SCRIPTS directory
cat > dbs_oncheck.sh
And paste the following code:
#!/bin/sh # =========================================================================== # Este documento contiene datos propiedad intelectual de DEISTER # S.A. Este documento no puede ser publicado, copiado o cedido # total o parcialmente sin permiso escrito de DEISTER S.A. # # Al utilizar este software, usted reconoce y concuerda que su uso # es bajo su responsabilidad y que ninguna de las partes involucradas # en la creación, producción o prestación del servicio es responsable # de cualquier perjuicio directo, incidental, consecuente, indirecto # o punitivo o de pérdida, costo o gasto alguno (incluyendo honorarios # legales, honorarios de peritos u otro desembolso) que pueda surgir # directa o indirectamente a través de su uso, incluyendo pero no # limitado a lo causado por virus, defectos, acción humana o inacción # del sistema informático, línea telefónica, hardware, software o errores # en el programa. # # description: Ejecuta oncheck sobre las bases de datos # processname: dbs_oncheck.sh # # $Id: dbs_oncheck.sh $ # ====================================================================== INFORMIXDIR=${INFORMIXDIR:-`grep "^informix:" /etc/passwd | awk -F: '{ print $6 }'`} INFORMIXSERVER=${INFORMIXSERVER:-`uname -n|awk -F'.' '{print $1}'`} DB_LOCALE=${DB_LOCALE:-es_es.8859-1} CLIENT_LOCALE=${CLIENT_LOCALE:-es_es.8859-1} DBDATE=${DBDATE:-DMY4-} export INFORMIXDIR INFORMIXSERVER DB_LOCALE CLIENT_LOCALE DBDATE STATUS=OK MOTIVE="" LOGSYS=/usr/tmp/`basename $0 .sh`.`date +%w`.log # Usage message. usage () { STATUS=ERROR MOTIVE="Usage: `basename $0` [--dbsexclude <"'db1','db2',...">] \ [--dbsinclude <"'db1','db2',...">] \ [--mailto <"user1@domain.es,user2@domain.es,...">] \ [--mailerror <"user1@domain.es,user2@domain.es,...">]" echo >> $LOGSYS echo "Error: $1" >> $LOGSYS echo >> $LOGSYS echo $MOTIVE >> $LOGSYS exit 1 } #send email do_mail () { cat -v $LOGSYS | mail -s "$STATUS `basename $0` at `date`" -r `hostname` $1 } echo "#% " >$LOGSYS echo "#% START" >>$LOGSYS echo "#% name: `basename $0 .sh`" >>$LOGSYS echo "#% desc: Executes oncheck command on databases" >>$LOGSYS echo "#% " >>$LOGSYS echo "#% host: `uname -n`" >>$LOGSYS echo "#% date: `date +%d-%m-%Y`" >>$LOGSYS echo "#% time: `date +%H:%M`" >>$LOGSYS echo "#% " >>$LOGSYS echo " " >>$LOGSYS # ------------------------------------------------------------------- # Parse and verify arguments # ------------------------------------------------------------------- echo "Arguments:" >> $LOGSYS echo $* >> $LOGSYS echo >> $LOGSYS echo >> $LOGSYS #default value DBSEXCLUDE="\"\"" while echo $1 | grep ^- > /dev/null; do case $1 in --mailto|--mailerror|--dbsexclude|--dbsinclude) eval $( echo $1 | tr 'a-z' 'A-Z' | sed 's/-//g' | tr -d '\012')=\$2;; --) break;; -*) usage "unknown argument: $1";; *) break;; esac shift shift done ####################################################### # Main ####################################################### su informix -c "$INFORMIXDIR/bin/oncheck -cSRe -y -q" >>$LOGSYS 2>&1 if [ $? -gt 0 ]; then STATUS=ERROR echo "`date` ***** ERROR en oncheck -cSRe" >>$LOGSYS fi # Obtiene la lista de las bases de datos a procesar if [ -z "$DBSINCLUDE" ]; then DBSINCLUDE="\"\"" INCLCMD="1=1" else INCLCMD="1=0" fi su informix -c "$INFORMIXDIR/bin/dbaccess sysmaster" >>$LOGSYS 2>>$LOGSYS <<EOF SET ISOLATION TO DIRTY READ; UNLOAD TO "/tmp/dbslist.$$" DELIMITER ' ' SELECT name FROM sysdatabases WHERE name NOT MATCHES "sys*" AND name NOT IN ($DBSEXCLUDE) AND (name IN ($DBSINCLUDE) OR $INCLCMD) EOF if [ $? -gt 0 ]; then STATUS=ERROR echo "`date` ***** ERROR Obteniendo lista de bases de datos" >>$LOGSYS fi DBSLIST=`cat /tmp/dbslist.$$` rm -f /tmp/dbslist.$$ for DBS in `echo $DBSLIST | sed 's/name //g'`; do echo "Executing oncheck on $DBS" >>$LOGSYS su - informix -c "$INFORMIXDIR/bin/oncheck -cxcDI $DBS -y -q" >>$LOGSYS 2>&1 if [ `grep -c ERROR $LOGSYS` -gt 0 ]; then STATUS=ERROR echo "`date` ***** ERROR en oncheck -cxcDI $DBS" >>$LOGSYS fi done echo "" >>$LOGSYS echo "#% status: $STATUS" >>$LOGSYS echo "#% motive: $MOTIVE" >>$LOGSYS echo "#% enddate: `date +%d-%m-%Y`" >>$LOGSYS echo "#% endtime: `date +%H:%M`" >>$LOGSYS echo "" >>$LOGSYS echo "END $STATUS `basename $0 .sh` `date` " >>$LOGSYS echo "===================================================" >>$LOGSYS # ************************************************************************ # # We send the result of the process to the administrator via e-mail. # In this way we make sure that the administrator always knows # if the process is executed correctly or not. # For this you have to make sure that the equipment can do mail relay. # # ************************************************************************ if [ -n "$MAILTO" ]; then do_mail $MAILTO fi if [ -n "$MAILERROR" ] && [ "$STATUS" != "OK" ]; then do_mail $MAILERROR fi # END dbs_oncheck
Give it execution permisssions:
chmod +x dbs_oncheck.sh
Finally add the root crontab in the following execution:
crontab -e
00 2 * * 0 /CONFIG/SCRIPTS/dbs_oncheck.sh --mailto "sysadmin@empresa.es"
6 Verificación del estado del servidor Informix
Create a file named dbs_checkdb.sh in the /CONFIG/SCRIPTS directory
cat > dbs_checkdb.sh
And paste the following code:
#!/bin/sh # =========================================================================== # Este documento contiene datos propiedad intelectual de DEISTER # S.A. Este documento no puede ser publicado, copiado o cedido # total o parcialmente sin permiso escrito de DEISTER S.A. # # Al utilizar este software, usted reconoce y concuerda que su uso # es bajo su responsabilidad y que ninguna de las partes involucradas # en la creación, producción o prestación del servicio es responsable # de cualquier perjuicio directo, incidental, consecuente, indirecto # o punitivo o de pérdida, costo o gasto alguno (incluyendo honorarios # legales, honorarios de peritos u otro desembolso) que pueda surgir # directa o indirectamente a través de su uso, incluyendo pero no # limitado a lo causado por virus, defectos, acción humana o inacción # del sistema informático, línea telefónica, hardware, software o errores # en el programa. # # description: Verificacion del sistema # processname: dbs_checkdb.sh # # =========================================================================== INFORMIXDIR=${INFORMIXDIR:-`grep "^informix:" /etc/passwd | awk -F: '{ print $6 }'`} INFORMIXSERVER=${INFORMIXSERVER:-`uname -n|awk -F'.' '{print $1}'`} DB_LOCALE=${DB_LOCALE:-es_es.8859-1} CLIENT_LOCALE=${CLIENT_LOCALE:-es_es.8859-1} DBDATE=${DBDATE:-DMY4-} MSGPATH=`su - informix -c "onstat -c" | grep "^MSGPATH" | awk '{ print $2 }'` #En caso de que MSGPATH viene especificad con $INFORMIXDIR MSGPATH=`eval echo "$MSGPATH"` export INFORMIXDIR INFORMIXSERVER DB_LOCALE CLIENT_LOCALE DBDATE MSGPATH STATUS=OK MOTIVE="" LOGSYS=/usr/tmp/`basename $0 .sh`.`date +%w`.log TMPFILE=/tmp/dbs_checkdb.$$ ERRFILE=/tmp/dbs_checkdb.err # Usage message. usage () { STATUS=ERROR MOTIVE="Usage: `basename $0` [--spexclude <'dbspace1','dbspace2',...>][--maxdbspacefull <value>] \ [--maxchkpoint <value>][--maxtableextents <value>] \ [--maxtablepages <value>][--minfreelogsize <value>] \ [--maxlocks <value>][--maxvirtsegment <value>] \ [--maxsesmemory <value>][--maxfgwrites <value>] \ [--maxdeadlks <value>][--maxseqscans <value>] \ [--maxseqscanssize <value>] \ [--mailto <"user1@domain.es,user2@domain.es,...">] \ [--mailerror <"user1@domain.es,user2@domain.es,...">]" echo >> $LOGSYS echo "Error: $1" >> $LOGSYS echo >> $LOGSYS echo $MOTIVE >> $LOGSYS exit 1 } #send email do_mail () { cat -v $LOGSYS | mail -s "$STATUS `basename $0` at `date`" -r `hostname` $1 } # ************************************************************************ # DbmStatusCheck # Purpose: Check the availibility of the database server # Reason: If your database server is down, you could not access your data. # This might have a negative impact on your business. # ************************************************************************ do_DbmStatusCheck() { echo "--- $INFORMIXSERVER : Verificando estado" >>$LOGSYS su informix -c "$INFORMIXDIR/bin/onstat - | grep 'On-Line'" >>$LOGSYS if [ ! $? -eq 0 ]; then STATUS=ERROR echo "ERROR: Motor no disponible en $INFORMIXSERVER" >>$LOGSYS fi } # ************************************************************************ # DbmHdrStatusCheck # Purpose: Check Hdr is working properlly # Reason: If Hdr is not on, ... # This might have a negative impact on your business. # ************************************************************************ do_DbmHdrStatusCheck() { echo "--- $INFORMIXSERVER : Verificando estado HDR" >>$LOGSYS su informix -c "$INFORMIXDIR/bin/onstat -g dri | egrep '(primary|secondary)' | grep ' on '" >>$LOGSYS if [ ! $? -eq 0 ]; then STATUS=ERROR echo "ERROR: HDR no disponible en $INFORMIXSERVER" >>$LOGSYS fi } # ************************************************************************ # ConnectCheck # Purpose: Make sure that a connect thru 'dbaccess' is possible to any server # names defined in your ONCONFIG file (i.e. DBSERVERNAME,DBSERVERALIASES). # Reason: The previous method 'DbmStatusCheck' checks the availability # of your database server. However the fact that your database server # is 'online' does not always ensure that you could connect to your # defined servernames. So this additional test is helpful in some # special situations. # ************************************************************************ do_ConnectCheck() { echo "--- $INFORMIXSERVER : Verificando conectividad de DBSERVERS" >>$LOGSYS DBSERVERS=`grep -v "^#" $INFORMIXDIR/etc/sqlhosts | grep "on" | awk '{ print $1 }'` for SERVER in $DBSERVERS ; do echo " Connecting to server $SERVER" >>$LOGSYS echo "connect to '@$SERVER'" | su - informix -c "$INFORMIXDIR/bin/dbaccess -e -" >$TMPFILE 2>&1 if [ $? -eq 0 ]; then echo " Connected OK." >>$LOGSYS else echo "ERROR Connection exceeded Timout. Returncode: $? " >>$LOGSYS STATUS=ERROR cat $TMPFILE >>$LOGSYS fi done } # ************************************************************************ # LongTxCheck # Purpose: Check to see if there are any ongoing long transactions. # Reason: Long transactions should be avoided. They consume major resources # of your database server. If a long transaction exclusive high water # mark (LTXEHWM) is reached, all other write activities will be blocked. # ************************************************************************ do_LongTxCheck() { echo "--- $INFORMIXSERVER : Verificando transacciones demasiado grandes " >>$LOGSYS su informix -c "$INFORMIXDIR/bin/dbaccess sysmaster" >>$LOGSYS 2>$ERRFILE <<! UNLOAD TO "$TMPFILE" SELECT srt.sid, srt.username, scl.pid FROM systxptab stx, sysrstcb srt, sysscblst scl WHERE stx.owner = srt.address and srt.sid = scl.sid and stx.longtx = 1 and bitval(srt.flags, "0x80000") = 1 ! if [ $? != 0 ]; then STATUS=ERROR echo "ERROR: error en verificación de transacciones largas" >>$LOGSYS cat $ERRFILE >>$LOGSYS else if [ `cat $TMPFILE | wc -l` -gt 1 ]; then STATUS="WARNING LongTxCheck" echo "ATENCION: Transacciones demasiado largas -Long Tx-" >>$LOGSYS cat $TMPFILE >> $LOGSYS fi fi rm -f $ERRFILE $TMPFILE } # ************************************************************************ # DbspaceFullCheck # Purpose: Check the filling degree of your dbspaces # Reason: Managing disk space is one of the primary tasks of a DBA. # If one of your dbspaces runs out of space, some applications could stop working. # ************************************************************************ do_DbspaceFullCheck() { echo "--- $INFORMIXSERVER : Verificando espacio ocupado de por los dbspaces " >>$LOGSYS su informix -c "$INFORMIXDIR/bin/dbaccess sysmaster - " >$TMPFILE 2>&1 <<! SELECT name[1,18], ROUND(SUM(chksize)*2/1000, 3) size_Mb, ROUND(SUM(DECODE(sysdbspaces.is_sbspace , 0, nfree, udfree))*2/1000, 3) free_Mb, ROUND((SUM(chksize-DECODE(sysdbspaces.is_sbspace , 0, nfree, udfree))/SUM(chksize)) * 100, 3) usado FROM sysdbspaces, syschunks WHERE sysdbspaces.dbsnum = syschunks.dbsnum AND name NOT IN ($SPEXCLUDE) GROUP BY 1 HAVING (SUM(chksize-DECODE(sysdbspaces.is_sbspace , 0, nfree, udfree)) * 100)/SUM(chksize) > $MAXDBSPACEFULL ORDER BY 4 DESC ! if [ $? != 0 ]; then STATUS=ERROR echo "============================================================" >>$LOGSYS echo "ERROR: error en análisis de ocupacion de dbspaces" >>$LOGSYS echo "============================================================" >>$LOGSYS cat $TMPFILE >> $LOGSYS else if [ `cat $TMPFILE | grep -c "No rows found"` -eq 0 ]; then STATUS="WARNING DbspaceFullCheck" echo "============================================================" >>$LOGSYS echo "ATENCION: % ocupado en dbspaces > $MAXDBSPACEFULL %" >>$LOGSYS echo "============================================================" >>$LOGSYS cat $TMPFILE >> $LOGSYS echo "" >>$LOGSYS fi fi rm -f $TMPFILE } # ************************************************************************ # CheckpointCheck # Purpose: Parse the online.log for any violations of the configured maximum checkpoint time allowed. # Reason: Long checkpoints should be avoided. During a checkpoint all write # activities will be blocked. So the goal for every DBA is to keep the # checkpoint time as small as possible. # ************************************************************************ do_CheckpointCheck() { echo "--- $INFORMIXSERVER : Verificando tiempo invertido en check points " >>$LOGSYS ONLINELOG=$MSGPATH for CHKPOINT in `grep "Checkpoint Completed" $ONLINELOG | tail -100 | sed 's/Fuzzy//g' | awk '{ print $6 }' ` ; do if [ $CHKPOINT -gt $MAXCHKPOINT ]; then echo "ERROR: Se han encontrado check points de $CHKPOINT segundos" >>$LOGSYS STATUS=ERROR fi done } # ************************************************************************ # OntapeCheck # Purpose: check if ontape is done properlly on daily basis # ************************************************************************ do_OntapeCheck() { echo "--- $INFORMIXSERVER : Verificando ejecucion correcta de backup " >>$LOGSYS DATEBACKUP=`$INFORMIXDIR/bin/onstat -g arc | grep " 0 " | tail -1 | awk '{ print substr($4, 0, 10) }'` if [ "$DATEBACKUP" != "`date -d '1 day ago' +'%m/%d/%Y'`" ] && [ "$DATEBACKUP" != "`date +'%m/%d/%Y'`" ]; then echo "ERROR: Ultimo backup realizado el dia $DATEBACKUP" >>$LOGSYS STATUS=ERROR fi } # ************************************************************************ # OnlineLogCheck # Purpose: Parse the online.log and search special events # Reason: The online.log is an important information resource for the DBA. # It contains useful information about any problems that have occurred. # ************************************************************************ do_OnlineLogCheck() { echo "--- $INFORMIXSERVER : Verificando fichero de mensajes " >>$LOGSYS ONLINELOG=$MSGPATH grep -4 "Assert" $ONLINELOG >>$LOGSYS if [ $? -eq 0 ]; then STATUS=ERROR echo "===============================================" >>$LOGSYS echo "ERROR: Existen Asserts en el fichero de logs..." >>$LOGSYS fi echo "" >>$LOGSYS } # ************************************************************************ # LogFullCheck # Purpose: Checks to see how full the logical logs are and generates alarms # if one of the configured thresholds is exceeded. # Reason: The logical logs are one of the most important resources of the # database server. Your database server will be blocked if they become # full because they could not be backed up. You might also lose # transactions in the case of a failure if your logical logs have # not been backed up. Thus observing the behaviour of the logical # logs is also one of the primary activities of a DBA. # # Yes, we have the dynamic log allocation feature since IDS 9.30. But this # is not always a good thing. Poorly written applications performing large # transactions without any commit could trigger the allocation of several # additional logs scattered throughout your dbspaces if you have set # DYNAMIC_LOGS to 2 (which is also the default). All these dbspaces will # then be considered 'critical' (because they contain a logical log), so if # one of them is marked down for some reason, your database server will stop. # ************************************************************************ do_LogFullCheck() { echo "--- $INFORMIXSERVER : Verificando logical logs disponibles " >>$LOGSYS su informix -c "$INFORMIXDIR/bin/dbaccess sysmaster - " >>$TMPFILE 2>&1 <<! SELECT sum(size) free_log_pages FROM syslogs WHERE ((is_backed_up = 1 and is_used = 1) or (is_used = 0)) HAVING SUM(size) < $MINFREELOGSIZE ! # Obtiene los pendientes de backup # WHERE AND is_backed_up = 0 and is_used = 1 if [ $? != 0 ]; then STATUS=ERROR echo "============================================================" >>$LOGSYS echo "ERROR: error en verificación logical logs disponibles" >>$LOGSYS echo "============================================================" >>$LOGSYS cat $TMPFILE >> $LOGSYS else if [ `cat $TMPFILE | grep -c "No rows found"` -eq 0 ]; then STATUS="WARNING LogFullCheck" echo "============================================================" >>$LOGSYS echo "ATENCION: No tiene suficiente espacio de logical logs disponible" >>$LOGSYS echo "============================================================" >>$LOGSYS echo "Espacio disponible..." >> $LOGSYS cat $TMPFILE >> $LOGSYS fi fi rm -f $TMPFILE #Verifica los backups de logical logs LTAPEDEV=`su - informix -c "onstat -c" | grep "^LTAPEDEV" | awk '{ print $2 }'` LTAPEDIR=`dirname $LTAPEDEV` # Si es un fichero normal. (No es un dispositivo) if [ -f $LTAPEDEV ]; then echo "Verificando ejecucion de los backups de logical logs" >>$LOGSYS if [ `su - informix -c "onstat -l" | egrep "U.-" | wc -l` -gt 3 ]; then STATUS=ERROR echo "ERROR: Mas de tres logical logs pendientes de backup. " >>$LOGSYS echo " Verifique $INFORMIXDIR/etc/log_full.sh -Evento 23-" >>$LOGSYS fi if [ -d $LTAPEDIR ]; then echo "Verificando limpieza de logical logs en $LTAPEDIR" >>$LOGSYS if [ `find $LTAPEDIR -name "logfile.*" -ctime +7 -print | wc -l ` -gt 0 ]; then STATUS=ERROR echo "ERROR: No se realiza la limpieza de backup de logical logs antiguos" >> $LOGSYS echo " Se han encontrado ficheros logfile de mas de 7 dias" >> $LOGSYS fi fi fi } # ************************************************************************ # MaxExtentCheck # Purpose: Checks the number of extents for a table or a table fragment. # Reason: The number of extents per table is limited. The upper limit depends # on the page size of your system (2K or 4K) and the number of special # data types in your table (like datetime or interval). For a 2K system # the limit will be approximately 200-220 extents. If this limit is reached, # no more inserts into this table will be possible. You have reorganize the # relevant table which might be time consuming if the table is large (which is # obvious because it ran out of extents). # ************************************************************************ do_MaxExtentCheck() { echo "--- $INFORMIXSERVER : Verificando número de extents de tablas o fragmentos " >>$LOGSYS su informix -c "$INFORMIXDIR/bin/dbaccess sysmaster - " >>$TMPFILE 2>&1 <<! SELECT systabnames.dbsname[1,18], systabnames.tabname[1,18], substr(dbinfo( "DBSPACE" , systabinfo.ti_partnum ), 1, 18), systabinfo.ti_nextns, systabinfo.ti_nkeys, systabinfo.ti_npdata FROM systabnames, systabinfo WHERE systabnames.partnum = systabinfo.ti_partnum AND systabnames.dbsname in (select name from sysdatabases) AND systabnames.tabname not matches "sys*" AND systabinfo.ti_nextns >= $MAXTABLEEXTENTS ! if [ $? != 0 ]; then STATUS=ERROR echo "============================================================" >>$LOGSYS echo "ERROR: error en verificación de los extents de las tablas o fragmentos" >>$LOGSYS echo "============================================================" >>$LOGSYS cat $TMPFILE >> $LOGSYS else if [ `cat $TMPFILE | grep -c "No rows found"` -eq 0 ]; then STATUS="WARNING MaxExtentCheck" echo "===============================================================" >>$LOGSYS echo "ATENCION: Tablas o fragmentos con mas de $MAXTABLEEXTENTS extents" >>$LOGSYS echo " Para consolidar los fragmentos puede usar el comando SQL:" >>$LOGSYS echo " ALTER FRAGMENT ON TABLE table1 INIT IN targetdbs;" >>$LOGSYS echo " ALTER FRAGMENT ON INDEX index1 INIT IN targetdbs;" >>$LOGSYS echo "===============================================================" >>$LOGSYS cat $TMPFILE >> $LOGSYS fi fi rm -f $TMPFILE } # ************************************************************************ # MaxPageCheck # Purpose: Counts the number of pages allocated for a table or a table fragment. # Reason: There is an upper limit of 16,000,000 pages per table/fragment/index # in Informix Dynamic Server. You cannot insert any additional rows when the limit # is reached. You must reorganize the table (for example splitting a single table # into several fragments) before work can continue. 16,000,000 pages is not that much. # On a system using a 2K page size it is around 32 GB. # ************************************************************************ do_MaxPageCheck() { echo "--- $INFORMIXSERVER : Verificando número de páginas de tablas o fragmentos " >>$LOGSYS su informix -c "$INFORMIXDIR/bin/dbaccess sysmaster - " >>$TMPFILE 2>&1 <<! SELECT stn.dbsname[1,18], stn.tabname, sti.ti_nkeys, sti.ti_npdata, sti.ti_nptotal, dbinfo("dbspace", sti.ti_partnum) FROM systabnames stn, systabinfo sti WHERE stn.partnum = sti.ti_partnum AND stn.tabname not like "TBLSpace" AND sti.ti_nptotal >= $MAXTABLEPAGES ! if [ $? != 0 ]; then STATUS=ERROR echo "============================================================" >>$LOGSYS echo "ERROR: error en verificación de páginas de las tablas o fragmentos" >>$LOGSYS echo "============================================================" >>$LOGSYS cat $TMPFILE >> $LOGSYS else if [ `cat $TMPFILE | grep -c "No rows found"` -eq 0 ]; then STATUS="WARNING MAxPageCheck" echo "============================================================" >>$LOGSYS echo "ATENCION: Tablas o fragmentos con mas de $MAXTABLEPAGES páginas" >>$LOGSYS echo "============================================================" >>$LOGSYS cat $TMPFILE >> $LOGSYS fi fi rm -f $TMPFILE } # ************************************************************************ # SessionLockCheck # Purpose: Inspects the number of locks held by individual database sessions. # Reason: Poorly written applications can consume a huge number of locks. # This checks the number of locks held by each database session and # triggers appropriate alarms if one of the configured thresholds is exceeded. # ************************************************************************ do_SessionLockCheck() { echo "--- $INFORMIXSERVER : Verificando el número de locks de las sesiones " >>$LOGSYS su informix -c "$INFORMIXDIR/bin/dbaccess sysmaster - " >>$TMPFILE 2>&1 <<! SELECT sss.sid, sss.username, ssp.lktouts FROM syssessions sss, syssesprof ssp WHERE sss.sid = ssp.sid AND ssp.locksheld >= $MAXLOCKS ! if [ $? != 0 ]; then STATUS=ERROR echo "============================================================" >>$LOGSYS echo "ERROR: error en verificación de número de locks por sesion" >>$LOGSYS echo "============================================================" >>$LOGSYS cat $TMPFILE >> $LOGSYS else if [ `cat $TMPFILE | grep -c "No rows found"` -eq 0 ]; then STATUS="WARNING SessionLockCheck" echo "============================================================" >>$LOGSYS echo "ATENCION: Número de locks de alguna sesion excede $MAXLOCKS" >>$LOGSYS echo "============================================================" >>$LOGSYS cat $TMPFILE >> $LOGSYS fi fi rm -f $TMPFILE } # ************************************************************************ # VirtualSegmentCheck # Purpose: Counts the number of allocated virtual shared memory segments. # Reason: Allocating additional shared memory segments is resource intensive # and on some platforms (like HP/UX) degrades the overall performance # of your database server. There are also some limits on the amount # of shared memory that can be allocated, for example on 32-Bit AIX systems. # ************************************************************************ do_VirtualSegmentCheck() { echo "--- $INFORMIXSERVER : Verificando el número de segmentos de memoria virtual " >>$LOGSYS { su informix -c "$INFORMIXDIR/bin/dbaccess sysmaster -" 2>$TMPFILE <<! output to pipe "cat" without headings SELECT COUNT(*) FROM syssegments WHERE seg_class = 2 HAVING COUNT(*) > $MAXVIRTSEGMENT ! } | while read line; do # pipe the output to while read if [ "$line" ]; then # check if line is not NULL if [ $line -gt 0 ]; then STATUS="WARNING VirtualSegmentCheck" echo "============================================================" >>$LOGSYS echo "ATENCION: Número de segmentos de memoria virtual $line superior a $MAXLOCKS" >>$LOGSYS echo "============================================================" >>$LOGSYS fi fi done rm -f $TMPFILE } # ************************************************************************ # DbspaceDownCheck # Purpose: Checks if any dbspaces have been marked down. # Reason: You cannot access the data in 'down' dbspaces. You may need to # restore the data from an archive. # ************************************************************************ do_DbspaceDownCheck() { echo "--- $INFORMIXSERVER : Verificando dbspaces caidos " >>$LOGSYS su informix -c "$INFORMIXDIR/bin/dbaccess sysmaster - " >>$TMPFILE 2>&1 <<! SELECT sds.name, sck.fname FROM sysdbspaces sds, syschunks sck WHERE sds.dbsnum = sck.dbsnum and sck.is_offline = 1 UNION SELECT sds.name, sck.mfname FROM sysdbspaces sds, syschunks sck WHERE sds.dbsnum = sck.dbsnum and sck.mis_offline = 1 ! if [ $? != 0 ]; then STATUS=ERROR echo "============================================================" >>$LOGSYS echo "ERROR: error en verificación de dbspcaes caidos" >>$LOGSYS echo "============================================================" >>$LOGSYS cat $TMPFILE >> $LOGSYS else if [ `cat $TMPFILE | grep -c "No rows found"` -eq 0 ]; then STATUS="ERROR DbspaceDownCheck" echo "============================================================" >>$LOGSYS echo "ATENCION: Existen dbspaces marcados como caidos -down-" >>$LOGSYS echo "============================================================" >>$LOGSYS cat $TMPFILE >> $LOGSYS fi fi rm -f $TMPFILE } # ************************************************************************ # ChunkDownCheck # Purpose: Checks if any chunks are marked down. # Reason: You cannot access the data in 'down' chunks. You may need to # restore the data from an archive. # ************************************************************************ do_ChunkDownCheck() { echo "--- $INFORMIXSERVER : Verificando chunks caidos " >>$LOGSYS su informix -c "$INFORMIXDIR/bin/dbaccess sysmaster - " >>$TMPFILE 2>&1 <<! SELECT sds.name, sck.fname FROM sysdbspaces sds, syschunks sck WHERE sds.dbsnum = sck.dbsnum and sck.is_offline = 1 UNION SELECT sds.name, sck.mfname FROM sysdbspaces sds, syschunks sck WHERE sds.dbsnum = sck.dbsnum and sck.mis_offline = 1 ! if [ $? != 0 ]; then STATUS=ERROR echo "============================================================" >>$LOGSYS echo "ERROR: error en verificación de chunks caidos" >>$LOGSYS echo "============================================================" >>$LOGSYS cat $TMPFILE >> $LOGSYS else if [ `cat $TMPFILE | grep -c "No rows found"` -eq 0 ]; then STATUS=ERROR echo "============================================================" >>$LOGSYS echo "ATENCION: Existen chunks marcados como caidos -down-" >>$LOGSYS echo "============================================================" >>$LOGSYS cat $TMPFILE >> $LOGSYS fi fi rm -f $TMPFILE } # ************************************************************************ # SessionMemoryCheck # # Purpose: Inspects the allocated memory of each database session currently connected. # Reason: Depending on the number of prepared statements, recursive stored # procedures and some other factors, the allocated memory per session # might be high, especially if these sessions fail to free their prepared # statements. With a large number of users, you might suddenly hit the # known memory limitations on 32-bit systems. This method lets you identify # those memory-intensive sessions. # ************************************************************************ do_SessionMemoryCheck() { echo "--- $INFORMIXSERVER : Verificando memoria reservada por sesion " >>$LOGSYS su informix -c "$INFORMIXDIR/bin/dbaccess sysmaster - " >>$TMPFILE 2>&1 <<! SELECT sss.sid, sss.username, sum(sps.po_usedamt + sps.po_freeamt) FROM syssessions sss, syspools sps WHERE sss.sid || "" = sps.po_name GROUP BY 1,2 HAVING sum(sps.po_usedamt + sps.po_freeamt) > $MAXSESMEMORY ! if [ $? != 0 ]; then STATUS=ERROR echo "============================================================" >>$LOGSYS echo "ERROR: error en verificación de memoria reservada por sesion" >>$LOGSYS echo "============================================================" >>$LOGSYS cat $TMPFILE >> $LOGSYS else if [ `cat $TMPFILE | grep -c "No rows found"` -eq 0 ]; then STATUS="WARNING SessionMemoryCheck" echo "============================================================" >>$LOGSYS echo "ATENCION: Existen sesiones con mas de $MAXSESMEMORY de memoria reservada" >>$LOGSYS echo "============================================================" >>$LOGSYS cat $TMPFILE >> $LOGSYS fi fi rm -f $TMPFILE } # ************************************************************************ # ForegroundWriteCheck # Purpose: Checks the number of foreground writes that have occurred. # Reason: Foreground writes should be avoided. They slow down the performance # of your database server. Depending on the nature of your application # (batch or more interactive) you should prefer chunk writes or lru writes, # so that foreground writes almost never happen. # ************************************************************************ do_ForegroundWriteCheck() { echo "--- $INFORMIXSERVER : Verificando foreground writes " >>$LOGSYS su informix -c "$INFORMIXDIR/bin/dbaccess sysmaster - " >>$TMPFILE 2>&1 <<! SELECT value fgwrites FROM sysprofile WHERE name = "fgwrites" AND value > $MAXFGWRITES ! if [ $? != 0 ]; then STATUS=ERROR echo "============================================================" >>$LOGSYS echo "ERROR: error en verificación de foreground writes" >>$LOGSYS echo "============================================================" >>$LOGSYS cat $TMPFILE >> $LOGSYS else if [ `cat $TMPFILE | grep -c "No rows found"` -eq 0 ]; then STATUS="WARNING ForegroundWriteCheck" echo "============================================================" >>$LOGSYS echo "ATENCION: se ha excedido el número recomendado de foreground writes" >>$LOGSYS echo "============================================================" >>$LOGSYS cat $TMPFILE >> $LOGSYS fi fi rm -f $TMPFILE } # ************************************************************************ # DeadLockCheck # Purpose: Counts the number of deadlocks that have occurred. # Reason: Deadlocks should also be avoided. They normally result from an # inappropriate application design. However We've seen also a lot # of deadlocks because people forgot to create their tables in # 'row' lock mode (the default is 'page'). # ************************************************************************ do_DeadLockCheck() { echo "--- $INFORMIXSERVER : Verificando dead locks " >>$LOGSYS su informix -c "$INFORMIXDIR/bin/dbaccess sysmaster - " >>$TMPFILE 2>&1 <<! SELECT value deadlks FROM sysprofile WHERE name = "deadlks" AND value > $MAXDEADLKS ! if [ $? != 0 ]; then STATUS=ERROR echo "============================================================" >>$LOGSYS echo "ERROR: error en verificación de dead locks" >>$LOGSYS echo "============================================================" >>$LOGSYS cat $TMPFILE >> $LOGSYS else if [ `cat $TMPFILE | grep -c "No rows found"` -eq 0 ]; then STATUS=WARNING echo "============================================================" >>$LOGSYS echo "ATENCION: se ha excedido el número recomendado de dead locks" >>$LOGSYS echo "============================================================" >>$LOGSYS cat $TMPFILE >> $LOGSYS fi fi rm -f $TMPFILE } # ************************************************************************ # ReadCacheCheck # Purpose: Checks the current read cache rate of your database server. # Reason: The read cache rate is an indicator of the overall performance of # your database server. The goal for OLTP systems is too keep the read # cache rate over 95 percent. # ************************************************************************ do_ReadCacheCheck() { echo "--- $INFORMIXSERVER : Verificando porcentaje de lecturas en cache " >>$LOGSYS su informix -c "$INFORMIXDIR/bin/dbaccess sysmaster - " >>/dev/null 2>&1 <<! UNLOAD TO "$TMPFILE" SELECT name, value FROM sysprofile spe WHERE spe.name IN ("dskreads", "bufreads") ORDER BY 1 ! for line in `cat $TMPFILE`; do # pipe the output to while read if [ "$line" ]; then # check if line is not NULL NAME=`echo $line | awk -F'|' '{ print $1 }'` VALUE=`echo $line | awk -F'|' '{ print $2 }'` if [ "$NAME" = "dskreads" ]; then DSKREADS=$VALUE fi if [ "$NAME" = "bufreads" ]; then BUFREADS=$VALUE fi fi done let "percent = $BUFREADS * 100 / ($BUFREADS + $DSKREADS)" if [ $percent -lt 95 ]; then STATUS=WARNING echo "============================================================" >>$LOGSYS echo "ATENCION: Porcentaje impacto en cache muy bajo $percent" >>$LOGSYS echo "============================================================" >>$LOGSYS fi rm -f $TMPFILE } # ************************************************************************ # WriteCacheCheck # Purpose: Checks the current write cache rate of your database server. # Reason: Almost the same as the above described 'ReadCacheRate'. The goal # for OLTP systems is to keep the write cache rate over 85 percent. # However depending on the nature of the application (for example # write-intensive batch applications) this might not always be possible. # ************************************************************************ do_WriteCacheCheck() { echo "--- $INFORMIXSERVER : Verificando porcentaje de escrituras en cache " >>$LOGSYS su informix -c "$INFORMIXDIR/bin/dbaccess sysmaster - " >>/dev/null 2>&1 <<! UNLOAD TO "$TMPFILE" SELECT name, value FROM sysprofile spe WHERE spe.name IN ("dskwrites", "bufwrites") ORDER BY 1 ! for line in `cat $TMPFILE`; do # pipe the output to while read if [ "$line" ]; then # check if line is not NULL NAME=`echo $line | awk -F'|' '{ print $1 }'` VALUE=`echo $line | awk -F'|' '{ print $2 }'` if [ "$NAME" = "dskwrites" ]; then DSKWRITES=$VALUE fi if [ "$NAME" = "bufwrites" ]; then BUFWRITES=$VALUE fi fi done let "percent = $BUFWRITES * 100 / ($BUFWRITES + $DSKWRITES)" if [ $percent -lt 95 ]; then STATUS=WARNING echo "============================================================" >>$LOGSYS echo "ATENCION: Porcentaje impacto en cache muy bajo $percent" >>$LOGSYS echo "============================================================" >>$LOGSYS fi rm -f $TMPFILE } # ************************************************************************ # SequentialScansCheck # Purpose: Checks the number of sequential scans that occurred on individual tables. # Reason: Sequential scans on large tables should normally be avoided in OLTP # systems. In data warehouse environments they are quite common. # ************************************************************************ do_SequentialScansCheck() { # ti_nextns ( number of extents ) # ti_nptotal ( space allocated ) # ti_npused ( space used ) # ti_npdata ( space used by data , indexes excluded ) echo "--- $INFORMIXSERVER : Verificando sequential scans " >>$LOGSYS su informix -c "$INFORMIXDIR/bin/dbaccess sysmaster - " >>$TMPFILE 2>&1 <<! SELECT stn.dbsname[1,18], stn.tabname[1,18], sti.ti_npdata, sti.ti_nrows, spf.seqscans FROM systabnames stn, systabinfo sti, sysptprof spf WHERE stn.partnum = sti.ti_partnum and stn.partnum = spf.partnum and sti.ti_npdata >= $MAXSEQSCANSSIZE and spf.seqscans >= $MAXSEQSCANS and stn.dbsname NOT IN ('sysadmin') and bitand(sti.ti_flags,"0x8000004") = 0 ! if [ $? != 0 ]; then STATUS=ERROR echo "ERROR: error en verificación de sequential scans" >>$LOGSYS cat $TMPFILE >> $LOGSYS else if [ `cat $TMPFILE | grep -c "No rows found"` -eq 0 ]; then STATUS=WARNING echo "ATENCION: sequential scans exceden $MAXSEQSCANS" >>$LOGSYS cat $TMPFILE >> $LOGSYS fi fi rm -f $TMPFILE } # ************************************************************************ # ReadyQueueCheck # Purpose: Counts the number of threads currently waiting on the ready queue. # Reason: Threads will be put on the ready queue because all available CPU virtual processors (VPs) are currently busy. They wait for a free virtual processor, hence the database session is blocked. A constantly large number of threads on the ready queue ('onstat -g rea'), leads to the conclusion that you have to add additional CPU VPs. # However if you have already configured the same number of CPU VPs as physical processors available in the machine, you might have to add more physical processors or investigate other performance tuning activities. This domain inspector allows you to specify the number of samples that should be taken before computing the average number of threads on the ready queue. This ensures that the computed value is more representative. # ************************************************************************ do_ReadyQueueCheck() { echo "--- $INFORMIXSERVER : Verificando hebras esperando una ready queue " >>$LOGSYS # onstat -g rea # SHOW: lines, tids, thread_counts, total_thread_counts, avg_thread_counts } # ************************************************************************ # dbWho # Purpose: List users conected to each database. # Reason: # ************************************************************************ do_dbWho() { echo "--- $INFORMIXSERVER : Verificando lista de usuarios conectados " >>$LOGSYS su informix -c "$INFORMIXDIR/bin/dbaccess sysmaster" >>$LOGSYS 2>&1 <<! select sysdatabases.name[1,18] database, syssessions.username[1,18], syssessions.hostname, syslocks.owner sid from syslocks, sysdatabases , outer syssessions where syslocks.rowidlk = sysdatabases.rowid and syslocks.tabname = "sysdatabases" and syslocks.owner = syssessions.sid order by 1; ! if [ $? != 0 ]; then STATUS=ERROR echo "ERROR: error en obtencion de la lista de usuarios" >>$LOGSYS fi } # ************************************************************************ # dbList # Purpose: List all databases, owner and logging status # Reason: # ************************************************************************ do_dbList() { echo "--- $INFORMIXSERVER : Lista de las BB.DD. y sus dbspaces " >>$LOGSYS su informix -c "$INFORMIXDIR/bin/dbaccess sysmaster" >>$LOGSYS 2>$ERRFILE <<! select substr(dbinfo("DBSPACE",partnum), 1, 18) dbspace, name[1,18] database, owner[1,15], is_logging logging, is_buff_log buff_log from sysdatabases order by dbspace, name; ! if [ $? != 0 ]; then STATUS=ERROR echo "ERROR: error en obtencion de la lista de bases de datos" >>$LOGSYS cat $ERRFILE >>$LOGSYS fi rm -f $ERRFILE } # ************************************************************************ # do_dbRotateLogs # Purpose: Rotate IBM-IDS logs and remove old assert fails # Reason: # ************************************************************************ do_dbRotateLogs() { # Eliminamos de /tmp o /usr/tmp assert-faileds de mas de 7 dias echo "Eliminando ficheros assert fail de IBM-IDS -af.*-" >> $LOGSYS find /tmp \( -name 'af.*' \) -atime +7 -print -exec rm '{}' \; find /usr/tmp \( -name 'af.*' \) -atime +7 -print -exec rm '{}' \; if [ -f $MSGPATH ]; then cp $MSGPATH ${MSGPATH}.`date '+%w'` cat /dev/null > $MSGPATH fi } # ************************************************************************ # do_dbCheckDistributions # Purpose: Check if DB contains statistics updated with distributions # Reason: update statistics with distributions has been proved that # has a bad effect in performance # ************************************************************************ do_dbCheckDistributions() { DBSLIST="" echo "--- $INFORMIXSERVER : Verificando si hay estadisticas con distribuciones " >>$LOGSYS su informix -c "$INFORMIXDIR/bin/dbaccess sysmaster" >>$LOGSYS 2>>$LOGSYS <<EOF SET ISOLATION TO DIRTY READ; UNLOAD TO "/tmp/dbslist.$$" DELIMITER ' ' SELECT name FROM sysdatabases WHERE name NOT MATCHES "sys*" EOF if [ $? -gt 0 ]; then STATUS=ERROR echo "`date` ***** ERROR Obteniendo lista de bases de datos" >>$LOGSYS fi DBSLIST=`cat /tmp/dbslist.$$` rm -f /tmp/dbslist.$$ for DBS in `echo $DBSLIST | sed 's/name //g'`; do { su informix -c "$INFORMIXDIR/bin/dbaccess $DBS -" 2>/dev/null <<! output to pipe "cat" without headings SELECT COUNT(*) FROM sysdistrib ! } | while read line; do # pipe the output to while read if [ -n "$line" ]; then # check if line is not NULL if [ "$line" -gt 0 ]; then STATUS=WARNING echo "============================================================" >>$LOGSYS echo "ATENCION: $DBS con estadisticas de distribucion (sysdistributions)" >>$LOGSYS echo "============================================================" >>$LOGSYS fi fi done done } # ************************************************************************ # do_dbDeisterLogs # Purpose: Check if Deister logical log backup is working ok # Reason: # ************************************************************************ do_dbDeisterLogs() { LTAPEDEV=`su - informix -c "onstat -c" | grep "^LTAPEDEV" | awk '{ print $2 }'` ALARMPROGRAM=`su - informix -c "onstat -c" | grep "^ALARMPROGRAM" | awk '{ print $2 }'` #En caso de que ALARMPROGRAM viene especificad con $INFORMIXDIR ALARMPROGRAM=`eval echo "$ALARMPROGRAM"` if [ "`grep -c DEISTER $ALARMPROGRAM`" == "0" ]; then STATUS=ERROR echo "El programa de backup de logical logs $ALARMPROGRAM no es el estándar de DEISTER" >>$LOGSYS fi } # ************************************************************************ # do_DeleteWebStudioLogs # Purpose: Check to see if there are any ongoing long transactions. # Reason: Long transactions should be avoided. They consume major resources # of your database server. If a long transaction exclusive high water # mark (LTXEHWM) is reached, all other write activities will be blocked. # ************************************************************************ do_DeleteWebStudioLogs() { echo "--- $INFORMIXSERVER : Borrando logs de WebStudio en wic_conf" >>$LOGSYS su informix -c "$INFORMIXDIR/bin/dbaccess wic_conf -" >>$LOGSYS 2>$ERRFILE <<! DELETE FROM wic_user_logs WHERE DATE(log_date) < TODAY-90 UNITS DAY; DELETE FROM wic_user_xsllogs WHERE DATE(xsl_date) < TODAY-90 UNITS DAY; DELETE FROM wic_user_qrylogs WHERE DATE(query_date) < TODAY-90 UNITS DAY AND user_code NOT IN('ldr','vsc','als'); DELETE FROM wic_user_trxlogs WHERE DATE(trx_date) < TODAY-90 UNITS DAY; DELETE FROM wic_jcub_xmldat WHERE DATE(cub_expires)< TODAY-90 UNITS DAY; DELETE FROM wic_messageboards WHERE DATE(msg_date) < TODAY-90 UNITS DAY; DELETE FROM wic_user_xsltjobs WHERE DATE(job_date) < TODAY-90 UNITS DAY AND job_stat = -1; DELETE FROM wic_user_jrepjobs WHERE DATE(job_date) < TODAY-90 UNITS DAY AND job_stat = -1; ! if [ $? != 0 ]; then STATUS=ERROR echo "ERROR: error borrando los logs de wic_conf" >>$LOGSYS cat $ERRFILE >>$LOGSYS fi rm -f $ERRFILE $TMPFILE } ####################################################### # Main ####################################################### echo "#% " >$LOGSYS echo "#% START" >>$LOGSYS echo "#% name: `basename $0 .sh`" >>$LOGSYS echo "#% desc: Check database engine status" >>$LOGSYS echo "#% " >>$LOGSYS echo "#% host: `uname -n`" >>$LOGSYS echo "#% date: `date +%d-%m-%Y`" >>$LOGSYS echo "#% time: `date +%H:%M`" >>$LOGSYS echo "#% " >>$LOGSYS echo " " >>$LOGSYS echo "Arguments:" >> $LOGSYS echo $* >> $LOGSYS echo >> $LOGSYS echo >> $LOGSYS #default value SPEXCLUDE="''" MAXDBSPACEFULL=80 MAXCHKPOINT=30 MAXTABLEEXTENTS=15 MAXTABLEPAGES=15000000 MINFREELOGSIZE=10000 MAXLOCKS=10 MAXVIRTSEGMENT=2 MAXSESMEMORY=2048000 MAXFGWRITES=100 MAXDEADLKS=1 MAXSEQSCANS=100 MAXSEQSCANSSIZE=20 # Analize parameters to exceed default values while echo $1 | grep ^- > /dev/null; do case $1 in --mailto|--mailerror|--spexclude|--maxdbspacefull|--maxchkpoint|--maxtableextents|--maxtablepages| \ --minfreelogsize|--maxlocks|--maxvirtsegment|--maxsesmemory|--maxfgwrites|--maxdeadlks|--maxseqscans|--maxseqscanssize) eval $( echo $1 | tr 'a-z' 'A-Z' | sed 's/-//g' | tr -d '\012')=\$2;; --) break;; -*) usage "unknown argument: $1";; *) break;; esac shift shift done do_DbmStatusCheck do_DbmHdrStatusCheck do_OntapeCheck do_LongTxCheck do_ConnectCheck do_DbspaceFullCheck do_CheckpointCheck do_OnlineLogCheck do_LogFullCheck do_MaxExtentCheck do_MaxPageCheck do_SessionLockCheck do_VirtualSegmentCheck do_DbspaceDownCheck do_ChunkDownCheck do_SessionMemoryCheck do_ForegroundWriteCheck do_DeadLockCheck do_ReadCacheCheck do_WriteCacheCheck do_SequentialScansCheck do_ReadyQueueCheck #do_dbWho #do_dbList do_dbCheckDistributions do_dbRotateLogs do_dbDeisterLogs #do_DeleteWebStudioLogs echo "" >>$LOGSYS echo "#% status: $STATUS" >>$LOGSYS echo "#% motive: $MOTIVE" >>$LOGSYS echo "#% enddate: `date +%d-%m-%Y`" >>$LOGSYS echo "#% endtime: `date +%H:%M`" >>$LOGSYS echo "" >>$LOGSYS echo "END $STATUS `basename $0 .sh` `date` " >>$LOGSYS echo "===================================================" >>$LOGSYS # ************************************************************************ # We send the result of the process to the administrator via e-mail. # In this way we make sure that the administrator always knows # if the process is executed correctly or not. # For this you have to make sure that the equipment can do mail relay. # ************************************************************************ if [ -n "$MAILTO" ]; then do_mail $MAILTO fi if [ -n "$MAILERROR" ] && [ "$STATUS" != "OK" ]; then do_mail $MAILERROR fi # END dbs_checkdb
Give it execution permissions:
chmod +x dbs_checkdb.sh
Finally add the root crontab in the following execution:
crontab -e
15 4 * * * /CONFIG/SCRIPTS/dbs_checkdb.sh
7 Copy to USB device
Create a file named usb_mirror.sh in the /CONFIG/SCRIPTS directory:
cat > usb_mirror.sh
And paste the following code:
#!/bin/sh # =========================================================================== # Este documento contiene datos propiedad intelectual de DEISTER # S.A. Este documento no puede ser publicado, copiado o cedido # total o parcialmente sin permiso escrito de DEISTER S.A. # # Al utilizar este software, usted reconoce y concuerda que su uso # es bajo su responsabilidad y que ninguna de las partes involucradas # en la creacion, produccion o prestacion del servicio es responsable # de cualquier perjuicio directo, incidental, consecuente, indirecto # o punitivo o de perdida, costo o gasto alguno (incluyendo honorarios # legales, honorarios de peritos u otro desembolso) que pueda surgir # directa o indirectamente a traves de su uso, incluyendo pero no # limitado a lo causado por virus, defectos, accion humana o inaccion # del sistema informatico, linea telefonica, hardware, software o errores # en el programa. # # description: Copia de directorios a un dispositivo de almacenamiento USB # processname: usb_mirror.sh # # =========================================================================== before="$(date +%s)" USBPATH=/media/WD DIRECTORIES="home backup" LOGSYS=/usr/tmp/`basename $0 .sh`.`date +%w`.log LOGSYS_VERBOSE=/usr/tmp/`basename $0 .sh`.`date +%w`.verbose STATUS=OK [ `uname -s` = "SunOS" ] && MAIL=mailx || MAIL=mail while : do case $1 in --mailto) shift; MAILTO=$1; shift;; --) shift; break;; -*) usage;; *) break;; esac done echo "#% " >$LOGSYS echo "#% START" >>$LOGSYS echo "#% name: `basename $0 .sh`" >>$LOGSYS echo "#% desc: USB Mirror directories" >>$LOGSYS echo "#% " >>$LOGSYS echo "#% host: `uname -n`" >>$LOGSYS echo "#% date: `date +%d-%m-%Y`" >>$LOGSYS echo "#% time: `date +%H:%M`" >>$LOGSYS echo "#% " >>$LOGSYS echo " " >>$LOGSYS if [ -n "$MAILTO" ]; then echo "Defined mail to send log: $MAILTO" >>$LOGSYS echo " " >>$LOGSYS fi # ----------------------------------------------------------- # # ----------------------------------------------------------- echo "Mounting filesystem ..." >> $LOGSYS mount $USBPATH if [ `mount | grep $USBPATH | wc -l` -eq 0 ]; then echo "ERROR USB DEVICE: filesystem '$USBPATH' not mounted" >> $LOGSYS STATUS=ERROR fi if [ ! -d $USBPATH ]; then echo "ERROR USB DEVICE: filesystem '$USBPATH' not found" >> $LOGSYS STATUS=ERROR fi # ----------------------------------------------------------- # MIRRORING si el dispositiu USB esta disponible. # ----------------------------------------------------------- if [ "$STATUS" = "OK" ]; then for DIR in $DIRECTORIES ; do echo "" >> $LOGSYS echo "Processing directory /$DIR" >> $LOGSYS # Status del directori origen SRC_DIR_STATUS=0 if [ ! -d /$DIR ]; then echo " ERROR: Directory /$DIR not exists" >> $LOGSYS STATUS=ERROR SRC_DIR_STATUS=1 fi # Status del directori desti a usb device USB_DIR_STATUS=0 if [ "$SRC_DIR_STATUS" = "0" ] && [ ! -d $USBPATH/$DIR ]; then echo " Creating directory $USBPATH/$DIR ..." >> $LOGSYS mkdir $USBPATH/$DIR USB_DIR_STATUS=$? if [ "$USB_DIR_STATUS" != "0" ]; then echo " ERROR USB DEVICE: directory '$USBPATH/$DIR' can not be created" >> $LOGSYS STATUS=ERROR else echo " Directory $USBPATH/$DIR created" >> $LOGSYS fi fi if [ "$SRC_DIR_STATUS" = "0" ] && [ "$USB_DIR_STATUS" = "0" ]; then # Degut al gran nombre de linies emeses, el verbose el poso en altre fitxer # per a que no ho envii el sys_htmllogs (te extensio .verbose, no .log). # Pot arribar a generar un fitxer de 70MB i mig milio de linies. echo " Mirroring /$DIR $USBPATH/$DIR" >> $LOGSYS mirrordir --verbose --no-netrc /$DIR $USBPATH/$DIR >> $LOGSYS_VERBOSE fi done fi echo "" >> $LOGSYS # Compressio del fitxer verbose. echo "GZIP Compress file verbose $LOGSYS_VERBOSE" >> $LOGSYS gzip -f $LOGSYS_VERBOSE # ----------------------------------------------------------- # After copy ... delete recycle dirs # ----------------------------------------------------------- for dir in `find /home -name .recycle -type d`; do echo rm -rf $dir done # ----------------------------------------------------------- # Verify size of USB device # ----------------------------------------------------------- echo "" >> $LOGSYS echo "Verify free space in filesystem $USBPATH ..." >>$LOGSYS echo df -k $USBPATH | sed '1d' | sed 's/%/ /g' >>$LOGSYS df -k $USBPATH | sed '1d' | sed 's/%/ /g' | awk '{ if ($5 > 80 ) printf("FILESYSTEM %s con %d%% ocupado\n", $6, $5) }' > /tmp/checkos_df.tmp if [ -s /tmp/checkos_df.tmp ]; then STATUS=ERROR echo "ERROR USB DEVICE: filesystem space free < 20% " >>$LOGSYS fi rm -f /tmp/checkos_df.tmp after="$(date +%s)" elapsed_seconds="$(expr $after - $before)" echo "Elapsed time for USB mirror is: '$elapsed_seconds'" >> $LOGSYS # ----------------------------------------------------------- # umount # ----------------------------------------------------------- echo "Umounting filesystem to safe USB device" >> $LOGSYS umount $USBPATH echo "" >>$LOGSYS echo "#% status: $STATUS" >>$LOGSYS echo "#% motive: $MOTIVE" >>$LOGSYS echo "#% enddate: `date +%d-%m-%Y`" >>$LOGSYS echo "#% endtime: `date +%H:%M`" >>$LOGSYS echo "" >>$LOGSYS echo "END $STATUS `basename $0 .sh` `date` " >>$LOGSYS echo "======================================================" >>$LOGSYS if [ -n "$MAILTO" ]; then echo "sending mail" echo $MAIL -s "$STATUS USB MIRROR at `uname -n` `date`" $MAILTO $MAIL -s "$STATUS USB MIRROR at `uname -n` `date`" $MAILTO < $LOGSYS echo "sending mail done" fi
Darle permisos de ejecución:
chmod +x usb_mirror.sh
Finalmente añadir en el crontab de root la siguientes ejecución:
crontab -e
30 4 * * 1-5 /CONFIG/SCRIPTS/usb_mirror.sh --mailto "sysadmin@empresa.es"
Donde sysadmin@empresa.es debe ser reemplzado por la dirección de correo electrónico del administrador de sistemas responsable de la instalación.
8 Resumen de actividad
Crear un archivo de nombre sys_htmllogs.sh en el directorio /CONFIG/SCRIPTS
cat > sys_htmllogs.sh
Y pegar el siguiente código:
#!/bin/sh # =========================================================================== # Este documento contiene datos propiedad intelectual de DEISTER # S.A. Este documento no puede ser publicado, copiado o cedido # total o parcialmente sin permiso escrito de DEISTER S.A. # # Al utilizar este software, usted reconoce y concuerda que su uso # es bajo su responsabilidad y que ninguna de las partes involucradas # en la creación, producción o prestación del servicio es responsable # de cualquier perjuicio directo, incidental, consecuente, indirecto # o punitivo o de pérdida, costo o gasto alguno (incluyendo honorarios # legales, honorarios de peritos u otro desembolso) que pueda surgir # directa o indirectamente a través de su uso, incluyendo pero no # limitado a lo causado por virus, defectos, acción humana o inacción # del sistema informático, línea telefónica, hardware, software o errores # en el programa. # # description: Envio de correo electronico resumen # processname: sys_htmllogs.sh # # =========================================================================== STATUS=OK MOTIVE="" LOGSYS=/tmp/`basename $0 .sh`.`date +%w`.log WEEKDAY=`date +%w` LOGFILES=`ls -rt /usr/tmp/*.${WEEKDAY}.log` CURRDATE=`date +%d-%m-%Y` CURRHOST=`uname -n` # Usage message. usage () { STATUS=ERROR MOTIVE="Usage: `basename $0` --mailto <"user1@domain.es,user2@domain.es,..."> \ [--mailerror <"user1@domain.es,user2@domain.es,...">]\ [--pexclude <"nas_mirror\|sys_rsync">]" echo >> $LOGSYS echo "Error: $1" >> $LOGSYS echo >> $LOGSYS echo $MOTIVE >> $LOGSYS exit 1 } #send email do_mail () { cat -v $LOGSYS | mail -s "$(echo -e "$STATUS `basename $0 .sh`\nContent-Type: text/html")" -r `hostname` $1 } if [ "X`echo -n`" = "X-n" ]; then echo_n() { echo ${1+"$@"}"\c"; } else echo_n() { echo -n ${1+"$@"}; } fi check_log() { FILENAME=`basename $1` FILEPROC=`grep '#% name:' $1 | tail -1 | awk '{ print $3 }'` FILEDATE=`grep '#% date:' $1 | tail -1 | awk '{ print $3 }'` FILETIME=`grep '#% time:' $1 | tail -1 | awk '{ print $3 }'` FILEHOST=`grep '#% host:' $1 | tail -1 | awk '{ print $3 }'` FILESTAT=`grep '#% status:' $1 | tail -1 | awk '{ print $3 }'` FILEMOTI=`grep '#% motive:' $1 | tail -1 | awk '{ print substr($0, 12) }'` if [ "$FILEPROC" == "" ] && [ "$STATUS" == "OK" ]; then STATUS=WARNING MOTIVE="$MOTIVE File: $FILE Header #% Not found <BR>" fi if [ "$FILESTAT" == "ERROR" ] && [ "$STATUS" != "ERROR" ]; then STATUS=ERROR MOTIVE="File: $FILE status: ERROR <BR>" fi if [ "$FILESTAT" == "WARNING" ] && [ "$STATUS" == "OK" ]; then STATUS=WARNING MOTIVE="File: $FILE status: WARNING <BR>" fi } # ************************************************************************ # # Main # # ************************************************************************ # ------------------------------------------------------------------- # Parse and verify arguments # ------------------------------------------------------------------- if [ $# -eq 0 ]; then usage "missing arguments" fi while echo $1 | grep ^- > /dev/null; do case $1 in --mailto|--mailerror|--pexclude) eval $( echo $1 | tr 'a-z' 'A-Z' | sed 's/-//g' | tr -d '\012')=\$2;; --) break;; -*) usage "unknown argument: $1";; *) break;; esac shift shift done #Required params REQPARAMS=( mailto ) for PARAM in "${REQPARAMS[@]}" ; do arg=`echo $PARAM | tr 'a-z' 'A-Z'` if [ -z ${!arg} ]; then usage "missing argument --$PARAM" fi done if [ -n "$PEXCLUDE" ]; then LOGFILESAUX="" for FILE in $LOGFILES; do echo "$FILE" | grep -q "$PEXCLUDE" if [ $? -eq 0 ];then continue fi LOGFILESAUX="$LOGFILESAUX $FILE" done LOGFILES=$LOGFILESAUX fi echo "<HTML>" >$LOGSYS echo "<BODY STYLE='font-family: arial,helvetica; fot-size: 8pt;'>" >>$LOGSYS echo "<A NAME='TOP'>" >>$LOGSYS echo "<TABLE CELLSPACING='0' BORDER='1'>" >>$LOGSYS echo "<TR><TD BGCOLOR='#FFFFCC'><H1><FONT SIZE='3'>" >>$LOGSYS echo "Name: `basename $0`<BR>" >>$LOGSYS echo "Host: `uname -n`<BR>Date: `date`" >>$LOGSYS echo "</FONT></H1></TD></TR>" >>$LOGSYS echo "<TR><TD>" >>$LOGSYS echo "<H2><font size='2'>Resumen de las operaciones</FONT></H2>" >>$LOGSYS # Se usa el parametro -rt para ordenar por fecha de creacion # de mas antigua a mas nueva. De esto modo los ficheros se # concatenan ordenados por fecha. echo "<UL>" >>$LOGSYS for FILE in $LOGFILES; do check_log $FILE if [ -n "$FILEPROC" ]; then echo_n "<LI><A HREF='#$FILE'>" >>$LOGSYS if [ "$FILESTAT" != "OK" ]; then echo_n "<FONT FACE='courier' COLOR='RED'>" >>$LOGSYS else echo_n "<FONT FACE='courier'>" >>$LOGSYS fi echo_n "<PRE STYLE='display: inline; white-space: pre; font-size: 9pt'>" >>$LOGSYS echo "$FILESTAT#$FILENAME#$FILEDATE#$FILETIME" | awk -F# '{ printf "%-5s %-24s %-10s %-5s",$1,$2,$3,$4 }' >>$LOGSYS echo_n "</PRE>" >>$LOGSYS echo_n "</FONT>" >>$LOGSYS echo "</A></LI>" >>$LOGSYS fi done echo "</UL><BR>" >>$LOGSYS # Verificamos que estamos mirando los logs adecuados # y que son de la fecha correcta STATUS="OK" for FILE in $LOGFILES; do check_log $FILE if [ -n "$FILEPROC" ]; then if [ "$FILEDATE" != "$CURRDATE" ]; then echo "<FONT COLOR='RED' SIZE='2'>WARNING: File: $FILE Date expected: [ $CURRDATE ] Found: [ $FILEDATE ] </FONT><BR>" >>$LOGSYS fi fi done echo "<BR></TD></TR>" >>$LOGSYS for FILE in $LOGFILES; do check_log $FILE BGCOLOR="#CCCCCC" if [ "`grep '#% status:' $FILE | tail -1 | awk '{ print $3 }'`" != "OK" ]; then BGCOLOR="#FFDDCC" fi echo "<TR><TD BGCOLOR='$BGCOLOR'><A NAME='$FILE'><PRE>" >>$LOGSYS grep "#%" $FILE >> $LOGSYS if [ `grep -c "#%" $FILE` -eq 0 ]; then echo "$FILE" >> $LOGSYS fi echo "</PRE>" >> $LOGSYS echo "<A HREF='' onclick='document.getElementById(\"`basename $FILE`\").style.display=\"block\"; return false;'>Show</A>" >> $LOGSYS echo "</TD></TR>" >>$LOGSYS echo "<TR><TD><PRE ID='`basename $FILE`' STYLE='font-size: 8pt; display: none'>" >>$LOGSYS # Emitimos el body del log grep -v "#%" $FILE >> $LOGSYS echo "</TD></TR>" >>$LOGSYS done echo "</TABLE>" >>$LOGSYS echo "</BODY></HTML>" >>$LOGSYS # ************************************************************************ # # Enviamos el resultado del proceso al administrador via e-mail. # De este modo nos aseguramos que el administrador siempre sabe # si el proceso se ejecuta correctamente o no. # Para ello hay que asegurase que el equipo puede hacer mail relay. # # ************************************************************************ if [ -n "$MAILTO" ]; then do_mail $MAILTO fi if [ -n "$MAILERROR" ] && [ "$STATUS" != "OK" ]; then do_mail $MAILERROR fi rm -f $LOGSYS # END sys_htmllogs
Darle permisos de ejecución:
chmod +x sys_htmllogs.sh
Finalmente añadir en el crontab de root la siguiente ejecución:
crontab -e
00 8 * * * /CONFIG/SCRIPTS/sys_htmllogs.sh --mailto "sysadmin@empresa.es"