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

标签 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\;

最佳答案

除了其他评论之外,还有一些其他事情需要考虑。 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

或者conf页面

$ 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 编程。只要尽早养成良好的习惯,它们就会为你省去很多以后的悲伤。

关于linux - 用于在 Linux 上移动和重命名应用程序日志文件的 Bash 脚本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32397619/

相关文章:

linux - Git 还原有其他依赖于它的提交的提交

c - Linux中的函数插入(写函数)

bash - Docker容器看不到串口设备

linux - 获取处理器频率

bash - 使用带有 Go 的 Git Bash/MINGW64 在 Windows 上捕获 CTRL-C

java - unix中java命令的含义

linux - 从 ipv6 地址打开网站时出错

linux - "biosdevname"是如何工作的?

bash 序列 : wait for output, 然后开始下一个程序

bash - 将 Bash 中的变量扩展为 rsync 的参数