我有一个包含2个while循环的bash,第一个是跟踪某些事件的无限循环,第二个是读取日志文件并在特定行显示时执行某些操作:
#!/bin/bash
while [ 1 ]; do
...
done &
date=`date +%Y%m%d`
file="logs/$date.log"
tail -f $file | grep --line-buffered "ALERT" | while read line
do
...
done
这很好用,我唯一的问题是每天00:00之后日志会旋转到新的一天(这很遗憾地超出了我的控制范围),如何在00:01重新运行第二次循环? (记录旋转是第一次写入,但我不介意失去一分钟)
使用cron来杀死所有内容并重新启动并不是很好,因为它也会杀死我的第一个循环,因此我认为必须有一种智能的方法来从脚本内部执行此操作。
答案 0 :(得分:1)
您可以在第三个循环内运行第二个循环。在每次迭代中,第三个循环重新启动第二个循环。使用sleep
在00:01开始下一次迭代。
#!/bin/bash
secondLoop() {
date=$(date +%Y%m%d)
file="logs/$date.log"
tail -f $file | grep --line-buffered "ALERT" | while read line; do
...
done
}
while true; do
...
done &
while true; do
secondLoop &
pidSecondLoop=$!
sleep $(($(date -d 'tomorrow 00:01' +%s) - $(date +%s)))
kill $pidSecondLoop
done
答案 1 :(得分:0)
您可以通过在脚本中引入一个函数来实现。添加一个函数并将包含代码的while循环移动到其中,并在时间大于00.01时每天打破循环。像在代码中一样,从无限循环中调用函数。一旦你中断while循环函数将返回并且从无限循环中你将再次使用新的日志文件名调用该函数。