Не могу получить звук от чего-либо, запущенного через 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, а затем в скрипте инициализировать звук для получения звука.

Другие вопросы по тегам