In Linux Mint kann kein Audio von irgendetwas über cron / crontab ausgeführt werden

595
GTbrewer

Ich verwende Linux Mint 18.3 Cinnamon 64-bit (Version 3.6.6), und ich kann kein Audio von ALLEN, die über cron laufen, ausführen. Dazu gehören Kommandozeilen-Audio-File-Player, TTS-Apps wie espeak oder festival usw. Nichts scheint von cron zu funktionieren.

Ich benutze Erinnerungen für Dinge wie das Trainieren und den Typ für diesen Tag… Aber seit dem Umstieg von meinem alten, inzwischen ziemlich toten Mac Mini auf Linux Mint funktionieren diese nicht mehr (sie funktionieren von einer normalen Xterm-Befehlszeile aus) ). Ich verwende niemals relative Pfade in Crontab für irgendetwas, das ist es also nicht.

Ich habe versucht, Fehlermeldungen zu erhalten, indem ich Standardfehler in den Standard ausrichte und diese Ausgabe zum Anhängen an eine Protokolldatei schicke. Nichts. Nur eine leere Protokolldatei.

Ich habe die Befehle aus meiner Crontab-Datei in ein Skript eingefügt und in Crontab durch einen (vollständig qualifizierten) Pfad / Dateinamen ersetzt. Dann öffne ich dieselbe Protokolldatei über das Skript. Wieder ist es geöffnet, aber es wird nichts hinzugefügt und immer noch kein Ton.

Hat jemand dieses Problem schon einmal gesehen? Irgendwelche Vorschläge für weitere Möglichkeiten, dieses Problem zu beheben oder zu beheben?

2
(1) Sind Sie angemeldet (an der Konsole), wenn Ihr Cron-Job ausgeführt wird? (2) Haben Sie in Ihrer Xterm-Sitzung und im Cron-Job versucht, sich Ihre Umgebung anzusehen (`` env``), und vergleichen Sie sie? Scott vor 6 Jahren 0
Pulseaudio oder ALSA? (1) Pulseaudio funktioniert nur als angemeldeter Benutzer, nicht als root (von cron). (2) ALSA funktioniert möglicherweise nicht direkt, wenn Pulseaudio alle ALSA-Geräte verwendet. (3) Wenn die cron-Skripts nicht als root ausgeführt werden, müssen sie möglicherweise einer Gruppe angehören, die auf Audiogeräte zugreifen kann. dirkt vor 6 Jahren 0

2 Antworten auf die Frage

0
C0deDaedalus

Ich habe dies in Linux Mint-Foren für genau Ihre Mint-Version gefunden 18.3. Nicht sicher, was genau hier die Ursache ist, aber probieren Sie es trotzdem.

0. Suchen Sie nach korrekten Konfigurationen in PavuControl

Konfiguration der Pulse Audio-Lautstärke

Wenn alles gut aussieht, machen Sie weiter.

1. Installieren Sie die neueste Kernelversion. Starten Sie neu und versuchen Sie es erneut.

Verwenden Sie UpdateManager oder diesen Befehl am 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 

oder im Zweifelsfall folgen Sie einfach diesem Community-Tutorial

2. Chcek für Audio, Treiber und Sound:

Führen Sie diesen Befehl aus und suchen Sie nach der Ausgabe. Hinweis Wenn etwas fehlt.

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

Es sollte so aussehen :

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 

Wenn Sie das sehen Advanced Linux Sound Architecture, kann die Installation alsamixerguihelfen.

3. AlsaMixerGUI: Install - Run - Reboot - Test - Sound

  • Installieren alsamixer

    sudo apt-get install alsamixergui 
  • Starte es

    alsamixer 
  • Drücken Sie F6und wählen Sie die eine oder andere Ihrer Soundkarten, und testen Sie, ob der Sound funktioniert.

  • Manchmal kann auch das Nachladen alsa helfen. Öffnen Sie dazu ein Terminal und führen Sie Folgendes aus:

    sudo alsa force-reload 
  • Es dauert einige Sekunden, bis es fertig ist. Starten Sie Ihren Computer neu und sehen Sie, ob Sie einen Ton erhalten.

4. Installieren Sie neu Alsaund PulseAudiound Reboot

Entfernen Sie alle alsa-baseund pulseaudioPakete.

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

Bereinigen Sie die Installation nach dem Update, um die neuesten Versionen zu erhalten:

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

Nachladen erzwingen Alsa

sudo alsa force-reload 

Starten Sie neu.

5. Immer noch keinen Ton :(

Nun, zumindest hast du es versucht. Das ist besser. Fühlen Sie sich frei, weitere Details oder andere Lösungen hinzuzufügen, die für Sie erarbeitet wurden.

Antwort auf Ziffer 5 oben: Ich bekomme Sound ... einfach nicht von irgendetwas, das von cron ausgeführt wird (alles funktioniert gut, wenn es nicht von cron ausgeführt wird). GTbrewer vor 6 Jahren 0
Oder anders ausgedrückt (btw, ~ / bin / say ist ein Shell-Skript, das festival und meine Optionen dafür verwendet): Dies funktioniert: "$ say test" ... dies nicht: "* 16 * * * / home / jim / bin / say test "(von meiner crontab). GTbrewer vor 6 Jahren 1
@GTbrewer, wie wäre es, wenn du selbst eine Antwort schreibst, die dein OP löst? C0deDaedalus vor 6 Jahren 0
Muss ich nicht wissen, warum Audio nicht mit cron funktioniert, bevor ich das schreiben kann? Anscheinend ist das etwas, was ich zuerst wissen muss. :-) Im Ernst, ich bin noch nie auf einen Fall gestoßen, bei dem Audio nicht funktioniert, wenn etwas von meiner Crontab läuft ... Ich habe keine Ahnung, was das verursachen könnte. GTbrewer vor 6 Jahren 1
@GTbrewer, stimme voll und ganz zu. C0deDaedalus vor 6 Jahren 0
Nun, es sieht so aus, als hätte dieser eine alle überlistet, also ändere ich die Richtung und schreibe jetzt einen Erinnerungsdienst in eine Tcl / Tk-Uhr, die ich in den 90ern geschrieben habe. Es funktioniert ähnlich wie der Kalenderservice, der mit cron gekreuzt wird ... und alle fünf Minuten überprüft werden (nicht jede Minute wie cron ...). Wenn Sie jedoch innerhalb von fünf Minuten wirklich eine Erinnerung benötigen, sind Sie schlechter dran als ich. nachdem er drei große Gehirntumore hatte, drei sehr schwere Gehirnoperationen, um sie zu entfernen, dann eine Ganzhirn- / Maximaldosis-Strahlentherapie .... Jedenfalls werden die Erinnerungen aus dieser Datei behandelt. Vielen Dank für den Versuch! GTbrewer vor 6 Jahren 1
Übrigens, wenn jemand Interesse hat, einen Blick darauf zu werfen, schicken Sie mir eine E-Mail an spooky130u AT gmail DOT com. KEIN HTML-Code ... Ihre E-Mails werden Spam (z. B. von 500 E-Mails zum Zeitpunkt der Überprüfung, 0 oder 1 ist normalerweise kein Spam). Das beinhaltet nicht Multipart / Alternative, übrigens ... es ist in Ordnung. GTbrewer vor 6 Jahren 0
0
GTbrewer

Ok, ich habe keine Antwort, warum es nicht funktioniert, aber ich habe eine Lösung.

Ich habe festgestellt, dass der Sound auch für hörbare Ansagen über procmail für bestimmte E-Mail-Absender defekt ist.

Also habe ich sehr einfache [Tcl] [1] -Skripte erstellt. Beim ersten Lauf anstelle von espeak usw. wird der Text einfach in eine ~/.alertsDatei geschrieben. Die zweite befindet sich im Hintergrund, eine Art Dämon, der darauf wartet, dass diese Datei existiert. Wenn dies der Fall ist, liest und spricht sie jede Zeile in der Datei (normalerweise nur eine) und löscht die Datei. Dateisperren wird in beiden Skripts verwendet, um Kollisionen zu vermeiden.

Das Tcl-Skript, das überprüft ~/.alertswird, wird von einem Xterm aus ausgeführt, so dass es keinen Fehler gibt, der mit Zeug von cron, procmail und wer weiß, was sonst noch passiert. Es funktioniert einfach.

Das ist also meine Lösung. Wie es, ich liebe es, hasse es… es funktioniert für mich.

Das erste Skript ist Addalert.

Und das ist das Skript - es wartet nur, wenn die Datei gesperrt ist (max. 20s, dann gehen sie davon aus, dass es feststeckt) und schreibt die Nachricht von 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 

Ich könnte beide Skripte abkürzen, indem ich die Checklock-Prozedur in eine eigene Datei verschiebe, aber für so kleine Dinge lohnt es sich nicht (für mich ... Ich verwende einfach cut / paste wie oben für schnelle Hacks). Dieses nächste wird Doalerts genannt und erledigt die eigentliche Arbeit (es wird von einem Xterm oder Terminal gestartet, wenn Sie diese Befehlszeile verwenden).

#!/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 { after 333 ; after 333 ; after 333 ; if {[file exists $alertsfile] && ![file exists $lockfile]} { handle_alerts } } 

Einfach gesagt wartet er (wieder max. 20s) auf das Entfernen der Sperrdatei, sie existiert, öffnet sie dann, liest sie (teilt sie in Zeilen auf, da sich jeder Alarm in einer eigenen Zeile befindet), schließt sie und verwendet dann ein TTS-Programm (espeak), um die Warnung (en) zu lesen. Dann werden die Sperrdatei (~ / .alertlock) und die Alarmdatei (~ / .alerts) gelöscht.

Welches Skript laufen Sie genau? confetti vor 6 Jahren 1
Das klingt nach einer vernünftigen Lösung, um ehrlich zu sein. Wenn die Skripte jedoch nicht zu lang oder zu komplex sind, ist es sinnvoll, sie hier als Referenz für alle zu veröffentlichen. JakeGould vor 6 Jahren 0
Warum erwähnte das Beispiel vor dem Skript GoFundMe? Ich hätte genauso gut ein anderes Beispiel aus dieser procmail-Regeldatei auswählen können ... Ich habe einfach das übergeordnete ausgewählt. Das ist es. Nur das Beispiel, das ich oben in der Datei ausgewählt habe. GTbrewer vor 6 Jahren 0