我希望监控将行添加到bash shell中的日志文件的平均速率。
我当前可以通过命令
监控文件中每行的行数watch -n 1 'wc -l log.txt'
然而,当我更喜欢费率时,这给了我总行数。换句话说,我想要一个命令,每次经常输出自执行命令以来已经添加到文件中的行数除以命令运行的秒数。
答案 0 :(得分:4)
对于每秒粗略计算的行数,请尝试:
tail -f log.txt | { count=0; old=$(date +%s); while read line; do ((count++)); s=$(date +%s); if [ "$s" -ne "$old" ]; then echo "$count lines per second"; count=0; old=$s; fi; done; }
(需要Bash。)
或者,分布在多行:
tail -f log.txt | {
count=0
old=$(date +%s)
while read line
do
((count++))
s=$(date +%s)
if [ "$s" -ne "$old" ]
then
echo "$count lines per second"
count=0
old=$s
fi
done
}
这使用date
以秒为单位记录时间。同时,它计算tail -f log.txt
生成的行数。每当另一秒通过时,就会打印出在该秒期间看到的行数。
一个终端,运行命令:
while sleep 0.1; do echo $((count++)); done >>log.txt
此命令每隔大约十分之一秒将一行写入文件log.txt
。
在另一个终端中,运行:
$ tail -f log.txt | { count=0; old=$(date +%s); while read line; do ((count++)); s=$(date +%s); if [ "$s" -ne "$old" ]; then echo "$count lines per second"; count=0; old=$s; fi; done; }
15 lines per second
10 lines per second
10 lines per second
10 lines per second
9 lines per second
10 lines per second
由于缓冲,第一次计数关闭。后续计数相当准确。
答案 1 :(得分:0)
您可以部署的简单脚本:
Filename="log.txt"
ln_1=`wc -l $Filename | awk '{print $1}'`
while true
do
ln_2=${ln_1}
sleep 1
ln_1=`wc -l $Filename | awk '{print $1}'`
echo $(( ln_1-ln_2 )) lines increased
done
答案 2 :(得分:0)
selenium.common.exceptions.WebDriverException: Message: session not created exception
命令支持通过var emailList = (from a in _db.FO_BA
join b in _db.EmailSentError
on a.CompanyCode equals b.CompanyCode
where a.BACode == vbacode select b.Emails)
选项查看附加行,该选项接受文件描述符或文件名。使用此选项,tail
会定期检查文件更改。检查的间隔取决于内核是否支持--follow
。基于Inotify的实现会及时检测到这些变化(我会说,几乎是即时的)。但是,如果内核不支持tail
,则inotify
会定期进行定期检查。在后一种情况下,inotify
默认情况下会休眠一秒钟。可以使用tail
选项更改睡眠间隔。
然而,我不会依赖计算中的睡眠间隔:
当'tail'使用inotify时,通常会忽略此轮询相关选项。
特别是因为Bash有一个内置的秒计数器,tail
变量(见--sleep-interval
):
此变量扩展为自shell启动以来的秒数。对此变量的赋值会将计数重置为指定的值,并且展开的值将成为分配的值加上自分配以来的秒数。
因此,您可以将SECONDS
初始化为info bash SECONDS
,运行循环读取SECONDS
的输出,并将速度计算为1
。但这会产生整个执行时间的平均值。最后tail
秒的平均值更加实用。它也很容易实现,因为Bash允许重置秒计数器。
示例强>
以下示例实现了该想法。它还具有number_of_lines / $SECONDS
- 就像交互模式下的输出一样。
N
P.S。
还有很多其他方法可以在几秒钟内获得偏移量。例如,您可以使用内置的watch
函数获取当前的Unix时间:
# The number of seconds for which we calculate the average speed
timespan=8
# The number of lines
lines=0
# We'll assume that the shell is running in interactive mode,
# if the standard output descriptor (1) is attached to the terminal.
# See http://www.tldp.org/LDP/abs/html/intandnonint.html
if [ -t 1 ]; then
is_interactive=1
format='%d lines/sec'
else
is_interactive=
format='%d lines/sec\n'
fi
# Reset the built-in seconds counter.
# Also, prevent division by zero in the calculation below.
SECONDS=1
# Save cursor position, if interactive
test -n "$is_interactive" && tput sc
while read line; do
if [[ $(( $SECONDS % $timespan )) -eq 0 ]]; then
SECONDS=1
lines=0
fi
if test -n "$is_interactive"; then
# Restore cursor position, then delete line
tput rc; tput el1
fi
printf "$format" $(( ++lines / SECONDS ))
done < <(tail -n0 -F log.txt)
另一种方法是调用printf
命令:# -1 represents the current time
# %s is strftime's format string for the number of seconds since the Epoch
timestamp=$(builtin printf '%(%s)T' -1)
。
但我相信从date
变量中读取更快更清洁。