用于在Linux上移动和重命名应用程序日志文件的Bash脚本

时间:2015-09-04 12:03:42

标签: linux bash

我对linux编码比较陌生。 我有以下脚本来移动我的ERP日志文件。

!/bin/bash #Andrew O. MBX 2015-09-03 
#HansaWorld Script to periodically move the log file 
_now=$(date +"%m_%d_%Y") 
mv /u/OML_Server_72/hansa.log /u/HansaLogs/hansa_$now.log

代码运行但不会将日志文件重命名为已移动的日期。 我还想检查文件何时超过90M大小,以便在每天结束时自动移动它。某种类型的cron工作。 请帮助

编辑后,这是我的新代码。

#!/bin/bash
#Andrew O. MBX 2015-09-03
#HansaWorld Script to periodically move the log file
now=$(date +"%m_%d_%Y")
mv /u/OML_Server_72/hansa.log /u/HansaLogs/hansa$now.log

我希望添加代码来检查hansa.log文件是否超过90M然后移动它。如果不是,那就保持原样。

cd /u find. -name '*hansa.log*' -size +90000k -exec mv '{}' /u/HansaLogs\;

2 个答案:

答案 0 :(得分:1)

除了其他评论之外,还有一些其他事项需要考虑。 tgo的logrotate建议很好。在Linux中,如果你每个人都坚持使用实用程序等等。那个man文件(虽然起初有点神秘),提供简明的使用信息。要查看给定实用程序可用的日志,请使用man -k name(某些分发按默认别名提供此选择功能),例如:

$ man -k logrotate
logrotate (8)        - rotates, compresses, and mails system logs
logrotate.conf (5)   - rotates, compresses, and mails system logs

然后,如果你想要logrotate页面:

$ man 8 logrotate

或配置页

$ man 5 logrotate.conf

您可能希望更改/考虑有关脚本的一些事项。首先,虽然变量now没有任何问题,但您可能会对date命令内置使用now感到困惑。没有冲突,但写now=$(date -d "now + 24 hours" "+%F %T")看起来很奇怪。 (建议使用类似tstamp的名称,而不是时间戳的缩写)。

为了可维护性,可读性等,您可以考虑将路径组件分配给稍后有助于提高可读性的变量。 (例如下面)。

最后,在移动,复制,删除等之前...... 验证目标文件的存在总是一个好主意,并且如果某些内容不合适,则提供错误消息。重写可能是:

#!/bin/bash
#Andrew O. MBX 2015-09-03
#HansaWorld Script to periodically move the log file

tstamp=$(date +"%m_%d_%Y")

logdir="/u/HansaLogs"
logname="/u/OML_Server_72/hansa.log"

if [ -f "$logname" ]; then
    mv "$logname" "$logdir/hansa_${tstamp}.log"
else
    printf "error: file not found '%s'.\n" "$logname" >&2
    exit 1
fi

注意: >&2只是将printf的输出重定向到stderr而不是stdout

对于find命令,不需要cdfind .find命令将path作为其第一个参数。此外,--size选项内置了对兆字节M的支持。这里的重写可能如下:

find /u -name "*hansa.log*" -size +90M -exec mv '{}' /u/HansaLogs \;

总而言之,看起来你会毫无问题地选择shell编程。只要养成良好的习惯,他们以后会为你节省很多的悲伤。

答案 1 :(得分:0)

嗨Guys Thanx的帮助。到目前为止,我已经提出了这个代码。我被困在创建一个cron工作,每隔22小时定期运行一次

#!/bin/bash
    #Andrew O. MBX 2015-09-03
    #HansaWorld Script to Check if log file exists before moving:

    tstamp=$(date +"%m_%d_%Y")
        logdir="/u/HansaLogs"
        logname="/u/OML_Server_72/hansa.log"
        minimumsize=90000
        actualsize=$(wc -c <"$logname")
        if [ $actualsize -ge $minimumsize ]; then
            mv "$logname" "$logdir/hansa_${tstamp}.log"
        else
            echo size is under $minimumsize bytes
        exit 1
        fi