- 浏览: 4732668 次
- 性别:
- 来自: 上海
文章分类
最新评论
-
bzhao:
你也应该可以这样:(not tested)./rbtunnel ...
在Bash脚本中怎么关闭文件描述符? -
bzhao:
如果有A进程原代码情况下,通过如下调用,把他的子进程继承关闭则 ...
在Bash脚本中怎么关闭文件描述符? -
Master-Gao:
楼主咋没分析下源码呢?
我使用过的Linux命令之dirname - 截取给定路径的目录部分 -
jiedushi:
tail -F 就可以吧
Linux下实时跟踪log4j日志文件的bash脚本 - 增强了tail -f的功能 -
java_is_new:
新手学习了,就是不明白为一个网卡配多个ip有什么用
我使用过的Linux命令之ifconfig - 网络配置命令
Linux下实时跟踪log4j日志文件的bash脚本 - 增强了tail -f的功能
本文链接:http://codingstandards.iteye.com/blog/803686 (转载请注明出处)
问题描述
在开发Java应用程序时,我们经常使用log4j作为日志输出工具,它可以根据配置文件来决定生成日志文件的策略,比如可以配置成每小时生成一个日志文件(附件压缩包里有log4j.properties的样本)。我们可以用tail -f logfile的形式去实时跟踪日志,以方便观察程序运行的信息。但是在log4j配置成每隔一定时间生成文件时,当时间间隔到达时,原来的日志文件会根据一定规则进行改名,比如ADMIN.LOG改成ADMIN.2010-11-05-10的格式,然后log4j会重新创建一个新的日志文件。这个时候,就会发现正在运行的tail -f命令不会继续输出新的日志文件内容,而是停在那里不动了,需要Ctrl+C杀掉原来的,再重新运行。能不能通过某种方式来避免这种情况发生呢?
解决思路
Linux系统下每个文件都有一个称为inode的数值,相当于文件的ID,在重新创建文件时,系统会新分配一个inode给这个文件,因此我们可以根据文件的inode是否改变来判断是否有新的日志文件生成。我根据这一点编写了一个bash脚本ftail.sh来做到了原来tail -f无法做到的事情,见后面的脚本内容部分,里面有注释。
使用方式
下 载附件ftail.tar.gz,上传到Linux系统,然后执行tar zxf ftail.tar.gz,就可以看到ftail.sh了。
格式:ftail.sh <file>
[root@web web_server]# ./ftail.sh
+-------------------------------------------------------------------------------------------------------+
| ftail.sh v0.1 - a bash script that enhanced 'tail -f', written by codingstandards@gmail.com |
+-------------------------------------------------------------------------------------------------------+
usage: ./ftail.sh <file>
[root@web web_server]# ./ftail.sh log/ADMIN.LOG
+-------------------------------------------------------------------------------------------------------+
| ftail.sh v0.1 - a bash script that enhanced 'tail -f', written by codingstandards@gmail.com |
+-------------------------------------------------------------------------------------------------------+
##### ./ftail.sh: FILE log/ADMIN.LOG INODE=118259971 PID 11495 #####
此处省略了日志输出的具体内容。
提示:可以把ftail.sh复制到/usr/bin下,然后就可以在任何有日志的目录进行使用了。
[root@web web_server]# cp ftail.sh /usr/bin -af
cp:是否覆盖“/usr/bin/ftail.sh”? y
[root@web web_server]# ftail.sh log/ADMIN.LOG
+---------------------------------------------------------------------------------------------+
| ftail.sh v0.1 - a bash script that enhanced 'tail -f', written by codingstandards@gmail.com |
+---------------------------------------------------------------------------------------------+
##### /usr/bin/ftail.sh: FILE log/ADMIN.LOG INODE=118259971 PID 11973 #####
此处省略了日志输出的具体内容。
脚本内容
附件压缩包中的ftail.sh文件
#!/bin/sh # ftail.sh = tail -f 的增强版本,可检查文件是否重建过或删除过 # usage: ftail.sh <file> # author: codingstandards@gmail.com # release time: v0.1 2010.11.04/05 # 显示title echo "+---------------------------------------------------------------------------------------------+" echo "| ftail.sh v0.1 - a bash script that enhanced 'tail -f', written by codingstandards@gmail.com |" >&2 echo "+---------------------------------------------------------------------------------------------+" echo # 判断参数个数 if [ "$#" != "1" ]; then echo "usage: $0 <file>" >&2 exit 1 fi # 取文件参数 FILE="$1" # 取文件的inode INODE=$(stat -c "%i" "$FILE") # 启动tail -f进程,并打印信息 # usage: fork_tail fork_tail() { if [ -r "$FILE" ]; then tail -f "$FILE" & PID=$! echo "##### $0: FILE $FILE INODE=$INODE PID $PID #####" >&2 else PID= INODE= echo "##### $0: FILE $FILE NOT FOUND #####" >&2 fi } # 杀掉tail进程 # usage: kill_tail kill_tail() { if [ "$PID" ]; then kill $PID fi } # 检查inode是否变化了 # usage: inode_changed inode_changed() { NEW_INODE=$(stat -c "%i" "$FILE" 2>/dev/null) if [ "$INODE" == "$NEW_INODE" ]; then return 1 else INODE=$NEW_INODE fi } # 设置陷阱,按Ctrl+C终止或者退出时杀掉tail进程 trap "kill_tail; exit" SIGINT SIGTERM SIGQUIT EXIT # 首次启动tail -f进程 fork_tail # 每隔一定时间检查文件的inode是否变化,如果变化就先杀掉原来的tail进程,重新启动tail进程 while : do sleep 5 if inode_changed; then kill_tail fork_tail fi done # END.
- ftail.tar.gz (1.3 KB)
- 下载次数: 88
发表评论
-
在Linux下将整个目录的文件转换字符编码的脚本
2012-06-18 20:47 3574源文件编码:gbk 源文件名称模式:*.ftl.gbk 目 ... -
Bash小技巧(惯用法)-2
2012-05-12 07:17 2151读取文件的第一行 很简单: head -1 file.tx ... -
Bash小技巧(惯用法)-1
2012-05-10 20:55 2570Bash小技巧(惯用法) 退出码判断(命令执行成功与否的判断 ... -
写一个Bash脚本来计算母亲节和父亲节的日期(推荐)
2012-05-10 20:31 2754写一个Bash脚本来计算母亲节和父亲节的日期 母亲节(每年 ... -
推荐Bash提高资料:写出健壮的Bash脚本
2012-03-20 13:58 3416写出健壮的Bash脚本 本文链接:http://coding ... -
在Linux下使用top命令查看所有java进程的状态
2011-10-28 11:09 9623在Linux下使用top命令查 ... -
导入MySQL数据库模式及数据的Bash脚本 (导出的姊妹篇)
2011-10-11 09:48 2775导入MySQL数据库模式及数据的Bash脚本 本文链接:ht ... -
导出MySQL数据库模式及数据的Bash脚本 真的很好用!
2011-10-10 10:14 3921导出MySQL数据库模式及数据的Bash脚本 本文链 ... -
导出MySQL数据库模式及数据的Bash脚本
2011-10-08 14:41 0导出MySQL数据库模式及数据的Bash脚本 ... -
AA制消费金额统计的Bash脚本
2011-09-02 19:57 2025AA制消费金额统计的Bash ... -
AA制消费金额统计的Bash脚本
2011-09-02 16:27 0AA制消费金额统计的Bash ... -
Bash字符串处理总结(与Java对比)
2011-08-26 22:02 0。 Bash字符串处理总结(与Java对比) ... -
用Google AJAX Search API对互联网上Linux命令出现次数排名
2010-10-31 14:30 3165用Google AJAX Search API对互联网上Lin ... -
Linux下把多个子目录中的源代码添加到CVS仓库的Bash脚本
2010-10-23 15:19 3434Linux下把多个子目录中的源代码添加到CVS仓库的Bash脚 ... -
我使用过的Linux命令之history
2010-09-30 14:03 0我使用过的Linux命令之history 本文链接: ( ... -
我使用过的Linux命令之g++
2010-09-29 13:51 0我使用过的Linux命令之g++ 用途说明 常用参数 使 ... -
我使用过的Linux命令之gzip
2010-09-29 13:51 0我使用过的Linux命令之gzip 用途说明 常用参数 ... -
我使用过的Linux命令之gunzip
2010-09-29 13:50 0我使用过的Linux命令之gunzip 用途说明 常用参数 ... -
我使用过的Linux命令之groups
2010-09-29 13:50 0我使用过的Linux命令之groups 用途说明 常用参数 ... -
我使用过的Linux命令之groupmod
2010-09-29 13:49 0我使用过的Linux命令之groupmod 用途说明 常用 ...
相关推荐
cleanup:一个增强的和广义的删除logfile 的脚本 3-1. 代码块和I/O 重定向 3-2. 将一个代码块的结果保存到文件 3-3. 在后台运行一个循环 3-4. 备份最后一天所有修改的文件. 4-1. 变量赋值和替换 4-2. 一般的变量赋值...
高级Bash脚本编程指南(一) 目录 ++++ 第一部分. 热身 1. 为什么使用shell编程 2. 带着一个Sha-Bang出发(Sha-Bang指的是#!) 2.1. 调用一个脚本 2.2. 初步的练习 第二部分. 基本 3. 特殊字符 4. 变量和...
chown -R user1 directory1 改变一个目录的所有人属性并同时改变改目录下所有文件的属性 chgrp group1 file1 改变文件的群组 chown user1:group1 file1 改变一个文件的所有人和群组属性 find / -perm -u+s 罗列一...
简单日志文件监视器是一个bash脚本,可用于监视日志文件或其他文本文件并在日志文件的输出上执行命令。 最初,使用此脚本的目的是能够轻松获取仍然通过电子邮件发送到电子邮件地址的日志文件的子集。 具有bash,wc,...
第一部分 Linux简介和原理介绍 第一章 概述 1.1 Linux 的历史及背景 1.1.1 什么是 Linux? 1.1.2 Linux 该怎么念? 1.1.3 Linux 的历史 1.1.4 Linux的优点 1.2 Linux与开源软件 1.3 Linux 与 Windows 的比较 1.3.1 ...
初始化工厂 bash中的factorio初始化脚本 要求 需要安装以下软件包: ... 检查日志,建议您在单独的会话中tail -f /opt/factorio/factorio-current.log 在配置中启用调试和/或: 尝试运行与factorio用户相同的命令
8.3.4 FTP的日志文件—/var/log/ xferlog 149 8.4 FTP管理工具 149 8.4.1 ftpshut 149 8.4.2 ftpwho 150 8.4.3 ftpcount 150 8.5 使用FTP客户程序 150 8.5.1 autoexpect 152 8.5.2 ncftp 152 8.5.3 tftp 153 8.5.4 ...
要获取存储在日志文件中的代码(例如'/var/log/homebridge.log' ),请运行bash脚本,如下所示: tail < ' /var/log/homebridge.log ' > | grep -oe ' Learned Code:.* ' | cut -d ' ' -f3 | tail -1捆绑配件...
问题描述:在linux shell中如何处理tail -n 10 access.log这样的命令行选项?在bash中,可以用以下三种方式来处理命令行参数,每种方式都有自己的应用场景。1,直接处理,依次对$1,$2,…,$n进行解析,分别手工处理;...
/bin/bash PING=`which ping` DATE=`date +%Y%m%d%H%M` TAIL=`which tail` LOG=./ping$DATE.log HOSTS=”selboo.com.cn 221.130.191.97″ COUNT=200 for myHost in $HOSTS do count=$(ping -c $COUNT $myHost | grep...