在组变量中基于主机名运行脚本

时间:2015-02-17 17:10:44

标签: linux bash

我是shell / bash的新手,我正在尝试执行清除Oracle文件日志的功能。我工作的环境必须完全打开所有日志,但我们遇到的问题是卷已经填满并且不允许重新启动服务。我试图创建一个脚本作为cron作业运行,以搜索目录,具体取决于他们所属的组(每个组的路径和名称略有不同)。

我已经让脚本通过" VMORDER"循环通过列出的组。我希望它拉出主机名。有没有办法让我说"如果VM属于一个组(即GP1,GP2等),那么运行" GP1s"脚本&#34 ;?

感谢您提供的任何帮助:)。

#!/bin/bash
SCRIPTDIR=[SCRIPT DIR]
GP1="vm01 vm02"
GP2="vm03 vm04 vm05"
GP3="vm06 vm07 vm08"
VMORDER="GP1 GP2 GP3"


##DIRECTORY PATHS
VCIE_DIRECTORY=[DIRECTORY]

##FILE EXCLUSION LISTING
access_log='access.log'
admin_server='AdminServer.log'
admin_service='adminservice.log'
app_ms_1='app_ms*.log'
app_ms_2='app_ms*.out'
app_wm_1='app_ms*.log'
app_wm_2='app_ms*.out'
audit_recorder_log='DefaultAuditRecorder.log'
jms_log='jms*.log'
osb_log='osb_domain.log'
diagnostic_log='diagnostic.log'

HNAME=$( hostname | cut -d'.' -f1 |  tr [:lower:] [:upper:] )

find_log_rotation(){
    for i in $(VMORDER)
        do
            clear_logs ${i}
        done
}



clear_logs(){


    ##GP1
    if [ $HNAME = GP1];
        find -P $VCIE_DIRECTORY/app_ms{1..4}/logs/ -type f -not -name "$app_ms_1" -not -name "$app_ms_2" -not -name "$access_log" -not -name "$audit_recorder_log" -not -name "$jms_log" -mtime 1       
    fi

    ##GP2
    if [ $HNAME = GP2];
        find -P $VCIE_DIRECTORY/app_wm{1..4}/logs/ -type f -not -name "$app_wm_1" -not -name "$app_wm_2" -not -name "$access_log" -not -name "$audit_recorder_log" -not -name "$jms_log" -mtime 1       
    fi

    ##GP3
    if [ $HNAME = GP3];
        find -P $VCIE_DIRECTORY/AdminServer/logs/ -type f -not -name "$admin_server" -not -name "$access_log" -not -name "$access_log" -not -name "$admin_service" -not -name "$osb_domain" -mtime 1        
    fi

1 个答案:

答案 0 :(得分:0)

简短回答:

如果主机名类似于“vm04”而你不是大写的,你可以使用:

if [[ "${GP1}" = *${HNAME}* ]]; then

double []使它成为一种特殊的语法,右边是= -sign是一个表达式。 不要在它周围加上引号,这会使它成为正常的字符串。

答案很长 你真的必须在不同的服务器上寻找不同的文件吗?当您在AdminServer下没有app_ms_1文件时,可以更轻松地选择要跳过的文件。

SKIP="${app_ms_1}|${app_ms_2}"
SKIP="${SKIP}|${access_log}|${audit_recorder_log}|${jms_log}"
SKIP="${SKIP}|${app_wm_1}|${app_wm_2}"
SKIP="${SKIP}|${admin_server}|${osb_domain}"

find ${VCIE_DIRECTORY}/*/logs -type f -mtime 1  | egrep -v "${SKIP}" | while read file; do
   echo Something with ${file}
done

首先确保上面的代码返回正确的文件(SKIP有$ {app_ms_3},是否正确处理了通配符)。

您需要使用HNAME吗?
您可能想要重写代码:

if [[ "${GP1}" = *${HNAME}* ]]; then
   SKIP="${app_ms_1}|${app_ms_2}"
   SKIP="${SKIP}|${access_log}|${audit_recorder_log}|${jms_log}"
   STARTDIR=${VCIE_DIRECTORY}/app_ms{1..4}/logs/"
fi
# Something like this also for GP2 and GP3
find ${STARTDIR} -type f -mtime 1  | egrep -v "${SKIP}" | xargs rm