我对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\;
答案 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
命令,不需要cd
和find .
,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