Просто используйте tail
. Он знает больше о том, как справляться со сложными случаями (вы можете посмотреть его источник).
В одном из моих проектов у меня есть что-то вроде этого для отслеживания файла трассировки, созданного проприетарным инструментом:
set fd [open [list | tail --follow=name --retry --lines 0 $opt(trace) 2>@1]]
chan event $fd readable [list FollowTrace $fd]
proc FollowTrace fd {
if {[gets $fd line] < 0} {
set code [catch {close $fd} err]
if {$code == 0} {
set ::result 0
} else {
puts stderr $err
set ::result 1
}
return
}
switch -regexp -matchvar parts -- $line {
{Tm_Session::Open.*FileName=([^,]+)} {
TryMakeLock [FullPathname [lindex $parts 1]]
}
{Tm_Session::Close.*FileName=([^,]+)} {
StartUpload [lindex $parts 1]
}
}
}
Общая идея заключается в том, что вы создаете tail
для данного файла, затем вводите цикл обработки событий и обрабатываете вывод tail
построчно.