Хорошо, у меня нет ответа на вопрос, почему это не работает, но у меня есть решение.
Я обнаружил, что звук также прерывается для звуковых объявлений через procmail для определенных отправителей электронной почты.
Поэтому я создал ОЧЕНЬ простые [Tcl] [1] скрипты. Первый, запустить вместо espeak и т.д., Просто записывает текст в файл ~/.alerts
. Второй находится в фоновом режиме, своего рода демон, ожидая, пока этот файл существует, и когда это происходит, он читает и произносит каждую строку в файле (обычно только одну), а затем удаляет файл. Блокировка файлов используется в обоих сценариях, чтобы избежать любых конфликтов.
Скрипт Tcl, проверяющий ~/.alerts
, запускается из xterm, поэтому в нем нет ошибок, связанных с вещами из cron, procmail, и кто знает, что еще. Это просто работает.
Так что это мое решение. Как это, любить это, ненавидеть это ... это работает для меня.
Первый скрипт addalert.
И это сценарий - он просто ждет, если файл заблокирован (максимум 20 с, затем предположим, что он застрял), и пишет сообщение из procmail:
#!/usr/local/bin/tclsh8.5
set lockfile /home/jim/.alertlock
proc checklock {} {
global lockfile
if {![file exists $lockfile]} { return }
set counter 20
while {[file exists $lockfile]} {
incr counter -1
if {$counter <= 0} {
file delete -force $lockfile
} ;# stuck lockfile
after 333 ;
after 333 ;
after 333 ;
}
file delete -force $lockfile
}
# wait if file is locked, then lock file while adding alert
checklock
set lock [open $lockfile w] ; puts $lock "" ; close $lock
set f [open /home/jim/.alerts a]
puts $f [lindex $argv 0]
close $f
file delete -force $lockfile
Я мог бы сократить оба сценария, перенеся процедуру проверки в свой собственный файл, но для таких крошечных вещей, как этот, это того не стоит (для меня ...Я просто использую вырезать / вставить, как указано выше, для быстрого взлома, как это). Следующий называется doalerts, и он выполняет настоящую работу (он запускается из xterm или терминала, если вы используете эту командную строку).
#!/usr/local/bin/wish8.4
set home /home/jim
set say /home/jim/bin/speak
set alertsfile $home/.alerts
set lockfile $home/.alertlock
cd $home
proc checklock {} {
global lockfile
if {![file exists $lockfile]} { return }
set counter 20
while {[file exists $lockfile]} {
incr counter -1
if {$counter <= 0} {
file delete -force $lockfile
} ;# stuck lockfile
after 333 ;
after 333 ;
after 333 ;
}
file delete -force $lockfile
}
proc handle_alerts {} {
global say alertsfile lockfile
set lock [open $lockfile w] ; puts $lock "" ; close $lock
set f [open $alertsfile r]
set alertlist [split [read $f] \n]
close $f
foreach alert $alertlist { exec $say $alert }
file delete $alertsfile
file delete $lockfile
}
while {1} {
after 333 ;
after 333 ;
after 333 ;
if {[file exists $alertsfile] && ![file exists $lockfile]} {
handle_alerts
}
}
Проще говоря, он ожидает (опять-таки, максимум 20 с) удаления файла блокировки, он существует, затем открывает файл, читает его (разбивая его на строки, так как каждое предупреждение находится в отдельной строке), закрывает его и затем использует программу TTS (espeak) для чтения предупреждений. Затем он удаляет файл блокировки (~/.alertlock) и файл предупреждений (~/.alerts).