Не могу получить звук от чего-либо, запущенного через cron/crontab в Linux Mint
Я использую 64-битную версию Linux Mint 18.3 Cinnamon (версия 3.6.6), и я не могу получить звук от НИЧЕГО, запускаемого через cron. Это включает проигрыватели аудиофайлов из командной строки, приложения TTS, такие как espeak или festival и т. Д. Похоже, что ничего не работает с cron.
Я использую напоминания для таких вещей, как мои тренировки и тип для того дня… Но с тех пор, как я переключился со своего старого, теперь уже совсем мертвого Mac Mini на Linux Mint, они больше не работают (они работают из обычной командной строки xterm). Я никогда не использую относительные пути в crontab для чего-либо, так что это не так.
Я попытался получить сообщения об ошибках, направив стандартную ошибку в стандарт и отправив этот вывод для добавления в файл журнала... Ничего. Просто пустой файл журнала.
Я поместил команды, которые были в моем файле crontab, в скрипт и заменил их в crontab на (полный) путь / имя файла. Затем я открываю тот же файл журнала через скрипт. Еще раз, он открыт, но к нему ничего не добавлено, и все равно нет звука.
Кто-нибудь видел эту проблему раньше? Любые предложения о дополнительных способах отладки или исправления?
3 ответа
Хорошо, у меня нет ответа на вопрос, почему это не работает, но у меня есть решение.
Я обнаружил, что звук также прерывается для звуковых объявлений через 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).
Я нашел это на форумах Linux Mint именно для вашей версии Mint 18.3
, Не уверен, что именно здесь является основной причиной, но в любом случае, просто попробуйте.
0. Ищите правильные конфигурации в PavuControl
Если все выглядит хорошо, тогда приступайте к этому.
1. Установите последнюю версию ядра. Перезагрузитесь и попробуйте снова для звука.
Используйте UpdateManager или эту команду на терминале.
apt install linux-image-4.4.0-53-generic linux-image-extra-4.4.0-53-generic linux-headers-4.4.0-53-generic linux-headers-4.4.0-53
или в любом случае, просто следуйте этому руководству сообщества
2. Chcek для аудио, драйверов и звука:
Запустите эту команду и найдите вывод. Примечание, если таковые отсутствуют.
pactl set-sink-mute 0 0 ; pactl list sinks ; lspci -v | grep -A7 -i "audio" ; lsmod
Это должно выглядеть так:
Audio: Card-1 NVIDIA GK107 HDMI Audio Controller
driver: snd_hda_intel bus-ID: 01:00.1
Card-2 Advanced Micro Devices [AMD/ATI] SBx00 Azalia (Intel HDA)
driver: snd_hda_intel bus-ID: 00:14.2
Sound: Advanced Linux Sound Architecture v: k4.4.0-116-generic
Если вы видите Advanced Linux Sound Architecture
, установка alsamixergui
может помочь.
3. AlsaMixerGUI: установить - запустить - перезагрузить - проверить - звук
устанавливать
alsamixer
sudo apt-get install alsamixergui
Запустить его
alsamixer
Нажмите F6 и выберите одну или другую звуковую карту и проверьте, работает ли звук.
Иногда принудительная перезагрузка alsa может помочь. Для этого откройте терминал и запустите:
sudo alsa force-reload
Потребуется несколько секунд, прежде чем это будет сделано. Перезагрузите компьютер и посмотрите, есть ли у вас звук.
4. Переустановите Alsa
а также PulseAudio
и перезагрузка
Удалить все alsa-base
а также pulseaudio
пакеты.
sudo apt-get remove --purge alsa-base pulseaudio
Чистая установка после обновления, чтобы получить последние версии:
sudo apt-get update
sudo apt-get install alsa-base pulseaudio
Принудительная перезагрузка Alsa
sudo alsa force-reload
Перезагружать.
5. Все еще не получаю звук:(
Ну, по крайней мере, вы пытались. Так-то лучше. Не стесняйтесь добавлять дополнительные детали или любое другое решение, которое сработало для вас.
Для получения звука вам может потребоваться инициализировать звук во временной оболочке crontab.
Поэтому лучше поместить корневой скрипт в crontab, а затем в скрипте инициализировать звук для получения звука.