Answers:
您可以使用导致其不打印标题的-t
开关watch
。但是,这仍然可以清除屏幕,因此使用简单的Shell循环可能会更好:
while sleep 1; do
wc -l my.log
done
优点之一是,您可以轻松添加其他命令(例如date
)和/或通过管道传递输出sed
以重新格式化它。顺便说一句,如果您在循环中sleep 1
与交换wc
,它将在错误时自动终止。
wait
-只需尝试watch -n 1 "sleep 5"
。
watch
有用的东西,但是它甚至没有给您带来什么好处,因此您的解决方案与基于表的解决方案一样好,但是都没有非常准确地回答“日志文件增长的速度”问题。
watch
有一个-p
选项,如果可能的话,它将正确地执行此操作(很明显,如果不允许同时执行多个命令,那么您将无法执行每1秒花费5秒的命令)。我知道,是我写的:-P
一个老问题,但我刚刚找到了一个很简单的答案:
watch -n1 'wc -l my.log | tee -a statistics.log'
这将每秒执行wc
一次,将其输出添加到statistics.log文件,并在屏幕上显示。
因此,您将得到一个充满数字的文件,代表的连续行数my.log
。
watch "($MYCMD | tee -a $MYLOG)"
不是watch "($MYCMD)" | tee -a $MYLOG
。如果您像我一样弄错了,输出将非常混乱。这里要注意的另一件事是,该命令默认情况下不会添加每个命令执行的时间戳,因此循环的答案可能仍对您更好。
怎么样
tail -f file.log | pv -rl > /dev/null
当我尝试从中获得更好的/记录的输出时,遇到了这个问题du -sh $data_path
。我使用了此处找到的“ while命令,请执行睡眠”模式,但使用了一些复杂的AWK来提供所需的输出。
while du -sh $data_path; do sleep 1; done | awk '
$1 != size {
size=$1;
path=$2;
time=systime();
seconds=time-prevtime;
if(seconds < 1000000000){
seconds=seconds" seconds"
}else{
seconds=""
}
print size, path, strftime("%m/%d/%Y@%H:%M:%S", time), seconds;
prevtime=time
}'
我实际上是作为oneliner进行此操作的,这就是为什么要使用分号的原因。但是为了使其可读性,我将其发布。输出如下:
502G /var/lib/cassandra/dump/ 05/22/2018@04:46:17
503G /var/lib/cassandra/dump/ 05/22/2018@04:46:59 42 seconds
504G /var/lib/cassandra/dump/ 05/22/2018@04:47:57 58 seconds
505G /var/lib/cassandra/dump/ 05/22/2018@04:48:55 58 seconds
506G /var/lib/cassandra/dump/ 05/22/2018@04:49:53 58 seconds
507G /var/lib/cassandra/dump/ 05/22/2018@04:50:50 57 seconds
508G /var/lib/cassandra/dump/ 05/22/2018@04:51:46 56 seconds
509G /var/lib/cassandra/dump/ 05/22/2018@04:52:44 58 seconds
510G /var/lib/cassandra/dump/ 05/22/2018@04:53:41 57 seconds
您可以创建一个脚本来帮您。我打电话给我keep
(喜欢,继续做),然后把它放在bin
路上。
这是我的脚本:
#!/bin/bash
echo "Repeating command $* every second"
while sleep 1; do
"$@"
done
"$@"
用来执行命令(参数),而不要使用unquoted $*
。这样,您将使外壳程序保留引号引起来的参数,等等。FTFY。