我是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
答案 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