【问题标题】:Rollover shell script翻转外壳脚本
【发布时间】:2014-04-03 15:33:23
【问题描述】:

假设一个 shell 脚本(commands.sh)只有很少的命令。

我需要编写一个脚本,将 commands.sh 执行的命令的输出发送到文件 f1.csv 如果文件大小超过 1MB,则输出流应转到文件 f2.csv 如果此处文件大小再次超过 1 mb,则输出流应转到文件 f3.csv 如果 f3.csv 的大小超过 1mb,则应删除旧的 f1 并再次创建新文件 f1, 输出流应写入 f1。这个过程应该继续下去。

我可以写crontab文件,只是shell脚本有点棘手

我一直在尝试:

#!/usr/bin/env bash

PREFIX="f"
# Maximum size after which you want a new file in bytes
MAX_SIZE=1048576
LAST_FILE=`ls "$prefix"*.csv | tail -1`
# Check if file exists and if it does not, create it.
if [[ -z "$LAST_FILE" ]]
  then
  LAST_FILE=$PREFIX"1.csv"
  touch $LAST_FILE
fi
LAST_FILE_NO=`echo $LAST_FILE | sed s/$PREFIX/''/ | sed s/.csv/''/`
LAST_FILE_SIZE=`stat -c %s $LAST_FILE`


if [ `stat -c %s $LAST_FILE` -lt 200 ]
  then
     `/bin/sh ./sam.sh >> $LAST_FILE`
  else
    UPCOMING_FILE_NO=$((LAST_FILE_NO+1))
    `/bin/sh ./sam.sh >> $PREFIX$UPCOMING_FILE_NO.csv`
fi

感谢大家的帮助。

编辑:辅助 shell 脚本也可以工作了... 现在,如果有人可以在完成 3 个文件并从 f1 开始后帮助我重置。

谢谢

【问题讨论】:

  • logrotate怎么样?

标签: linux bash shell unix terminal


【解决方案1】:

听起来你最好使用 logrotate,这取决于你的脚本是如何运行的。如果您在 cron 上运行“commands.sh”,则可以让 logrotate 轮换日志。这里有一个关于 logrotate 的很好的指南: http://linuxers.org/howto/howto-use-logrotate-manage-log-files

如果您的 commands.sh 不会在 cron 上,这意味着它不是触发它的常规时间间隔,您可以在脚本开始时手动设置日志轮换。我曾经不得不做类似的事情。我发现本指南非常有用:

http://wazem.blogspot.com/2013/11/simple-bash-log-rotate-function.html

【讨论】:

  • 嗨,但我不允许使用 logrotate。我们可以有一个shell脚本解决方案吗?
  • 我提供的第二个链接是一种在脚本开头实现您自己的日志轮换的方法。我会说使用它。当您的脚本运行时,第一个代码部分应该是日志轮换,然后它会执行您的脚本应该执行的正常工作。这样,每次运行脚本时都会轮换日志。
猜你喜欢
  • 1970-01-01
  • 2012-01-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多