Tamam, neden işe yaramadığına dair bir cevabım yok ama bir çözümüm var.
Belirli e-posta gönderenler için procmail aracılığıyla sesli duyurularda sesin de bozulduğunu keşfettim.
Bu yüzden ÇOK basit [Tcl] [1] betiklerini yarattım. İlk, espeak, vb. Yerine koşmak, metni yalnızca bir metne yazar. ~/.alerts
dosya. İkincisi, arka planda oturur, bir tür arka plan programı, bu dosyanın var olmasını bekler ve bu olduğunda, dosyadaki her satırı okur ve konuşur (genellikle yalnızca bir) ve sonra dosyayı siler. Her iki komut dosyasında da herhangi bir çarpışmayı önlemek için dosya kilitleme kullanılır.
Kontrol eden Tcl betiği ~/.alerts
bir xterm'den çalıştırıldığı için, cron, procmail ve kimin ne yaptığını bilen bir böcek yok. Sadece işe yarıyor.
Demek benim çözümüm. Beğen, sev, nefret et… benim için çalışıyor.
İlk komut dosyası addalert.
Ve bu komut dosyası --- sadece dosya kilitliyse bekler (en fazla 20 saniye)
sonra sıkışmış olduğunu varsayalım) ve mesajı procmail'den yazar:
#!/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
Checklock prosedürünü kendi dosyasına taşıyarak her iki betiği de kısaltabilirim, ancak bunun gibi küçük şeyler için buna değmez (benim için ... sadece böyle hızlı kesmek için yukarıdaki gibi kes / yapıştır kullan). Bir sonraki adımda doaler denir ve asıl işi yapar (bu komut satırını kullanırsanız bir xterm'den veya terminalden başlatılır).
#!/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
}
}
Basitçe söylemek gerekirse, kilit dosyasının kaldırılmasını bekler (tekrar, maksimum 20s), var olur, sonra dosyayı açar, okur (her alarm kendi satırında olduğu için satırlara böler), kapatır ve sonra uyarıları okumak için bir TTS programı (espeak) kullanır. Ardından kilit dosyasını (~ / .alertlock) ve uyarı dosyasını (~ / .alerts) siler.
env
) xterm oturumunuzda ve cron işinizde ve bunları karşılaştırarak mı?