2

Я использую Linux Mint 18.3 Cinnamon 64-bit (версия 3.6.6), и я не могу получить звук от НИЧЕГО, запускаемого через cron. Это включает проигрыватели аудиофайлов из командной строки, приложения TTS, такие как espeak или festival и т.д. Кажется, ничего не работает от cron.

Я использую напоминания для таких вещей, как мои тренировки и тип для того дня… Но с тех пор, как я переключился со своего старого, теперь уже совсем мертвого Mac Mini на Linux Mint, они больше не работают (они работают из обычной командной строки xterm ). Я никогда не использую относительные пути в crontab для чего-либо, так что это не так.

Я попытался получить сообщения об ошибках, направив стандартную ошибку в стандарт и отправив этот вывод для добавления в файл журнала ... Ничего. Просто пустой файл журнала.

Я поместил команды, которые были в моем файле crontab, в скрипт и заменил их в crontab на (полностью определенный) путь / имя файла. Затем я открываю тот же файл журнала через скрипт. Еще раз, это открыто, но ничего не добавлено к этому, и все еще нет звука.

Кто-нибудь видел эту проблему раньше? Любые предложения о дополнительных способах отладки или исправления?

2 ответа2

0

Я нашел это на Linux Mint Forums именно для вашей версии 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. Все еще не получаю звук :(

Ну, по крайней мере, вы пытались. Так-то лучше. Не стесняйтесь добавлять дополнительные детали или любое другое решение, которое сработало для вас.

0

Хорошо, у меня нет ответа на вопрос, почему это не работает, но у меня есть решение.

Я обнаружил, что звук также прерывается для звуковых объявлений через 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).

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .