Não é possível obter áudio de nada executado via cron / crontab no Linux Mint

2

Estou usando o Linux Mint 18.3 Cinnamon 64-bit (Versão 3.6.6), e não consigo obter nenhum áudio de QUALQUER COISA executado via cron. Isso inclui players de arquivos de áudio de linha de comando, aplicativos TTS como o espeak ou festival, etc. Nada parece funcionar no cron.

Eu uso lembretes para coisas como começar meus treinos, e o tipo para aquele dia… Mas desde que eu mudei do meu velho e agora bem acabado Mac Mini para o Linux Mint, eles não funcionam mais (eles funcionam de um normal linha de comando xterm). Eu nunca uso caminhos relativos em crontab para nada, então não é isso.

Eu tentei obter mensagens de erro direcionando o erro padrão para a saída padrão e enviando essa saída para anexar a um arquivo de log ... Nada. Apenas um arquivo de log vazio.

Eu coloquei os comandos que estavam no meu arquivo crontab em um script, e os substitui no crontab com um caminho / nome de arquivo (totalmente qualificado). Então eu abro o mesmo arquivo de log através do script. Mais uma vez, ele está aberto, mas nada é acrescentado a ele e ainda não há som.

Alguém já viu esse problema antes? Alguma sugestão sobre mais maneiras de depurar isso ou consertá-lo?

    
por GTbrewer 18.07.2018 / 01:38

2 respostas

0

Eu encontrei isso nos fóruns do Linux Mint para exatamente a sua versão do Mint 18.3 . Não tenho certeza, o que exatamente é causa raiz aqui, mas De qualquer forma, basta tentar.

0. Procure configurações corretas em PavuControl

Setudoparecebom,entãoprossigaparaele.

1.Instaleaversãomaisrecentedokernel.Reiniciare&tentenovamenteparaosom.

UseoUpdateManagerou este comando no terminal.

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

ou com qualquer dúvida, siga este Tutorial da comunidade

2. Chcek para áudio, drivers e Som:

Execute este comando e procure por saída. Nota Se alguma falta.

pactl set-sink-mute 0 0 ;  pactl list sinks ; lspci -v | grep -A7 -i "audio" ; lsmod

Deveria ser assim:

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

Se você vir o Advanced Linux Sound Architecture , a instalação do alsamixergui poderá ajudar.

3. AlsaMixerGUI: Instalar - Executar - Reiniciar - Teste - Som

  • Instale alsamixer

    sudo apt-get install alsamixergui
    
  • Execute

    alsamixer
    
  • Pressione F6 e escolha uma ou outra das suas placas de som e teste se o som funciona.

  • Às vezes o recarregamento de força pode ajudar. Para isso, abra um terminal e execute:

    sudo alsa force-reload
    
  • Demora alguns segundos antes de terminar. Reinicie o seu computador e veja se consegue algum som.

4. Reinstale Alsa e PulseAudio e reinicialize

Remova todos os pacotes alsa-base e pulseaudio .

sudo apt-get remove --purge alsa-base pulseaudio

Limpe a instalação após a atualização para obter as versões mais recentes:

sudo apt-get update
sudo apt-get install alsa-base pulseaudio

Forçar recarregar Alsa

sudo alsa force-reload

Reinicie.

5. Ainda não recebendo som: (

Bem pelo menos você tentou. Isso é melhor. Sinta-se à vontade para adicionar mais detalhes ou qualquer outra solução que funcione para você.

    
por 18.07.2018 / 06:23
0

Ok, eu não tenho uma resposta sobre por que isso não funciona, mas eu tenho uma solução.

Eu descobri que o som também está quebrado para anúncios audíveis via procmail para remetentes de e-mail específicos.

Então eu criei para scripts muito simples [Tcl] [1]. O primeiro, execute em vez de espeak, etc., simplesmente grava o texto em um arquivo ~/.alerts . O segundo fica em segundo plano, uma espécie de daemon, esperando que o arquivo exista, e quando isso acontece, ele lê e fala todas as linhas do arquivo (geralmente apenas uma) e, em seguida, exclui o arquivo. O bloqueio de arquivos é usado em ambos os scripts para evitar colisões.

O script Tcl que verifica ~/.alerts é executado a partir de um xterm, então ele não tem o bug que está mexendo com coisas do cron, procmail e quem sabe o que mais. Apenas funciona.

Então essa é a minha solução. Goste, ame, odeie ... funciona para mim.

O primeiro script é addalert.

E este é o script - ele apenas espera se o arquivo estiver bloqueado (máx. 20s então assuma que ele está preso) e escreve a mensagem do 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

Eu poderia encurtar os dois scripts movendo o procedimento de checklock para o seu próprio arquivo, mas para coisas minúsculas como esta, não vale a pena (para mim ... eu apenas uso o recurso de copiar / colar como descrito acima para hacks rápidos como esse) . Este próximo é chamado de doalerts, e faz o trabalho real (é lançado de um xterm, ou terminal, se você usar essa linha de comando).

#!/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
   }
}

Simplificando, ele espera (novamente, max 20s) pelo arquivo de bloqueio ser removido, ele existe, então abre o arquivo, lê-lo (dividindo-o em linhas, já que cada alerta está em sua própria linha), fecha e, em seguida, usa um programa TTS (espeak) para ler o (s) alerta (s). Em seguida, exclui o arquivo de bloqueio (~ / .alertlock) e o arquivo de alertas (~ / .alerts).

    
por 26.08.2018 / 05:24