Bash 监视日志文件直至其完成

Bash 监视日志文件直至其完成,bash,shell,logfile,Bash,Shell,Logfile,我是一名高中生,试图用bash编写一个脚本,在一台使用不同内核数的超级计算机上使用“qsub”命令提交作业。然后,该脚本将从每个生成的日志文件(称为“log.lammps”)中获取有关内核数量和超级计算机完成模拟所需时间的数据,并将这些数据存储在单独的文件中 因为每个日志文件需要不同的时间才能完全生成,所以我按照 在生成带有字符串“Total wall time:”的日志文件的最后一行时继续执行脚本 目前,我正在循环中使用以下代码,以便可以对所有指定数量的内核运行此代码: (tail-f-n0

我是一名高中生,试图用bash编写一个脚本,在一台使用不同内核数的超级计算机上使用“qsub”命令提交作业。然后,该脚本将从每个生成的日志文件(称为“log.lammps”)中获取有关内核数量和超级计算机完成模拟所需时间的数据,并将这些数据存储在单独的文件中

因为每个日志文件需要不同的时间才能完全生成,所以我按照 在生成带有字符串“Total wall time:”的日志文件的最后一行时继续执行脚本

目前,我正在循环中使用以下代码,以便可以对所有指定数量的内核运行此代码:

(tail-f-n0 log.lammps&)| grep-q“总墙时间:
但是,使用这段代码运行脚本会导致log.lammps文件被截断,并且即使在log.lammps文件完全生成时,脚本也不会完成


是否有其他方法使我的脚本仅在提交的作业完成后才能继续执行?

请尝试以下方法

# run tail -f in background
(tail -f -n0 log.lammps | grep -q "Total wall time:")  > out 2>&1 &

# process id of tail command
tailpid=$!

# wait for some time or till the out file hqave data
sleep 10

# now kill the tail process
kill $tailpid

我倾向于这样做: 和

比如:

notify-when-up2 --greater-than-or-equal-to 0 'age /etc/passwd' 10
这不会在文件中查找特定的模式,而是查找文件在10秒钟内停止更改的时间。您可以通过使用grep替换年龄来查找模式:

notify-when-up2 --true-command 'grep root /etc/passwd'
notify-when-up2可以向您发送电子邮件、弹出窗口或在状态更改时呼叫您。在某些情况下,与使用等待或其他方法相比,这不是一个很好的方法,但我发现自己每天都要使用好几次


HTH.

一种方法是在完成后触摸标记文件,然后等待:

#start process:
rm -f finished.txt;
( sleep 3 ; echo "scriptdone" > log.lammps ; true ) && touch finished.txt &

# wait for the above to complete
while [ ! -e finished.txt ]; do
   sleep 1;
done

echo safe to process log.lammps now...
如果您想避免繁忙的等待,还可以使用
inotifywait
,或
flock

编辑:


要处理第一个命令之一可能失败的情况,请将第一个命令分组,然后将
true
添加到末尾,以便组始终返回true,然后执行
&&touch finished.txt
。这样,即使第一个命令之一失败,finished.txt也会被修改,下面的循环不会永远等待。

那么您想要
tail-F-n0
?那
(…&)
在那里做什么?我想您可以删除
&
。非常感谢您的回复。我只是尝试了一下,但我发现我的脚本将继续,而不会意识到log.lammps文件已完全生成。这是否与第三行睡眠后的值3有关?请澄清并让我知道。非常感谢。以
sleep3
开头的行以
&
结尾,这意味着整行(包括睡眠)在后台运行。Bash启动新的shell来运行命令,并立即开始执行下一行(while语句)。
while
循环等待文件
finished.txt
存在。(因为此文件在脚本开始时是
rm
,并且仅在后台任务结束时重新创建,所以此繁忙循环仅在后台任务完成后才会退出)。请注意,bash中的用法
&&
告诉循环仅在第一个命令成功完成时才运行下一个命令。例如,如果
sleep3
失败,那么下一个命令将永远不会运行,
finished.txt
将永远不会被写入。在这种情况下,下面的while循环将永远不会退出。如果您的循环立即存在,则您可能尚未删除顶部的finished.txt,或者您的后台任务生成另一个后台任务,该任务将写入您的文件。感谢您的回复。我尝试了这种方法,但得到了以下结果:
awk:cmd。第1行:致命:无法打开文件“log.lammps”进行读取(没有这样的文件或目录)script.sh:第39行:9774终止(tail-f-n0 log.lammps | grep-q“Total wall time:”)>out 2>&1
。然后,我检查了log.lammps文件本身,查看其中是否包含任何数据,但发现它是空的。如果你能帮助我,我将不胜感激。谢谢。从您得到的错误来看,系统上似乎不存在该文件。这可能是因为生成该文件需要一些时间吗?我的脚本这一部分的目标是,一旦脚本识别出文件内容已完全生成,脚本将继续。是的,可能是这样,也许您需要确保先创建文件