使用BASH如何捕获日志文件的最后5行而不会导致文件锁定

时间:2016-01-15 08:58:06

标签: bash awk sed

我有一个由应用程序创建的文件。该应用程序不断将大量数据写入文件。 我需要定期捕获文件最后10行的副本并将其写入另一个文件而不会导致任何文件锁定,这可能会影响编写logFile的应用程序。

如何在不影响编写日志文件的应用程序的情况下执行此操作?即没有导致任何文件锁定。

logFile示例

1452431219885,546,Item Details Request,200,OK,text,true,12562,91,91,271,ip-172-31-36-138,0,134
1452431219886,1300,Select Item Request,200,OK,text,true,28541,91,91,444,ip-172-31-36-138,0,209
1452431219889,210,Login Success Page Request,200,OK,text,true,29405,91,91,123,ip-172-31-36-137,0,27
1452431219898,217,Item Details Request,200,OK,text,true,10620,91,91,215,ip-172-31-36-135,0,106
1452431219900,1668,Logout and Exit Request,200,OK,text,true,19676,92,92,1133,ip-172-31-36-136,0,266
1452431219902,589,Search Page Request,200,OK,text,true,13392,91,91,296,ip-172-31-36-138,0,147
1452431219903,589,Save Basket Request,200,OK,text,true,17473,91,91,294,ip-172-31-36-138,0,147
1452431219908,1135,Search Results Request,200,OK,text,true,561615,91,91,229,ip-172-31-36-136,0,116
1452431219914,1114,Item Details Request,200,OK,text,true,93243,91,91,282,ip-172-31-36-138,0,138
1452431219921,825,Select Item Request,200,OK,text,true,24354,91,91,339,ip-172-31-36-135,0,161

2 个答案:

答案 0 :(得分:4)

在大多数操作系统(即BSD,Linux,Mac,基本上不是Windows的任何操作系统)下,除非程序明确请求,否则文件永远不会被锁定。 即便如此,这些操作系统中的锁只是建议性的,因此不会影响那些不关心它们的程序。

所以答案是:几乎任何可以获取日志最后一行的东西都会在没有锁定的情况下完成。

答案 1 :(得分:1)

获取最后10行

如果我理解正确,你可以简单地使用:

# tail reads the input file and print out the last 10 lines (default)
tail /path/to/file.log > 10_lines.dump
# Change number of lines from default(10) to 5
tail -n 5 /path/to/file.log > 5_lines.dump

每隔X秒显示最后一行

如果您需要定期执行此操作而不保存输出,则可以使用watch

# watch show the output of the tail command every 5 seconds (default 2s)
watch -n 5 tail /path/to/file.log
# OR last 5 lines every 5 seconds
watch -n 5 tail -n 5 /path/to/file.log

提取并保存以供将来在后台参考

使用您选择的编辑器使用以下内容创建crontab文件(将其命名为file.crontab或按照您的意愿):

# ** Crontab file schema **
# .------------------ [m]inute:           [0 - 59] OR */x (every x minutes) 
# |   .-------------- [h]our:             [0 - 23] OR */x (every x hours) 
# |   |   .---------- [d]ay [o]f [m]onth: [1 - 31]
# |   |   |   .------ [mon]th:            [1 - 12] OR jan,feb,mar,apr... 
# |   |   |   |   .-- [d]ay [o]f [w]eek:  [0 - 6]  (Sunday can be 0 or 7)
# |   |   |   |   |                       (also: sun,mon,tue,wed,thu,fri,sat)
# m   h   d  mon dow
# *   *   *   *   *   command executed every minute with my user permission
# --
# Execute tail every 5 minutes and append last 10 lines of input to log.extract
*/5   *   *   *   *   tail "/path/to/file.log" >> "/path/to/log.extract"

使用crontab

在系统上安装它
crontab file.crontab