Не могу получить звук от чего-либо, запущенного через cron / crontab в Linux Mint

551
GTbrewer

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

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

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

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

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

2
(1) Вы вошли в систему (на консоли), когда выполняется задание cron? (2) Вы пытались посмотреть на свое окружение (запустить `` env``) в сеансе xterm и в задании cron и сравнить их? Scott 6 лет назад 0
Pulseaudio или ALSA? (1) Pulseaudio будет работать только как зарегистрированный пользователь, а не как root (из cron). (2) ALSA напрямую может не работать, если Pulseaudio использует все устройства ALSA. (3) Если сценарии cron не запускаются от имени пользователя root, возможно, они должны быть в группе, способной получить доступ к аудиоустройствам. dirkt 6 лет назад 0

2 ответа на вопрос

0
C0deDaedalus

Я нашел это на форумах 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. Все еще не получаю звук :(

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

Ответ на 5 выше: я получаю звук ... только не из-за чего-то, запускаемого cron (все это прекрасно работает, когда не запускается cron). GTbrewer 6 лет назад 0
Или, говоря по-другому (кстати, ~ / bin / say - это сценарий оболочки, использующий фестиваль и мои опции для него): Это работает: "$ say test" ... это не так: "* 16 * * * / home / Джим / бин / сказать тест "(из моего crontab). GTbrewer 6 лет назад 1
@ GTbrewer, а как насчет того, чтобы написать ответ, который решает ваш ОП? C0deDaedalus 6 лет назад 0
Разве мне не нужно знать, почему звук не работает из cron, прежде чем я смогу это написать? Похоже, это то, что мне нужно знать в первую очередь. :-) Серьезно, я никогда не сталкивался со случаем, когда звук не работает, когда он запускается из чего-то в моем crontab .... Я понятия не имею, что может быть причиной этого. GTbrewer 6 лет назад 1
@GTbrewer, полностью согласен с этим. C0deDaedalus 6 лет назад 0
Что ж, похоже, у этого все в тупике, поэтому я меняю направление и сейчас пишу сервис напоминаний для часов Tcl / Tk, которые я написал в 90-х. Он будет работать аналогично календарному сервису, пересекающему cron ... проверять ~ / напоминания каждые пять минут (не каждую минуту, как cron ... но если вам действительно нужно напоминание в течение пяти минут, вы хуже, чем я, сделав три больших опухоли головного мозга, три очень тяжелых операции на головном мозге, чтобы удалить их, затем лучевую терапию всего мозга / максимальной дозы .... В любом случае, он обработает напоминания из этого файла. Спасибо за попытку! GTbrewer 6 лет назад 1
Кстати, если кто-то заинтересован в том, чтобы взглянуть на него, напишите мне на spooky130u AT gmail DOT com. НЕТ HTML только ... ваше письмо будет рассылать спам (например, из 500 писем на момент проверки я 0 или 1 обычно не будет спамом). Это не включает в себя multipart / alternative, кстати ... это нормально. GTbrewer 6 лет назад 0
0
GTbrewer

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

Я обнаружил, что звук также прерывается для звуковых объявлений через 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 { after 333 ; after 333 ; after 333 ; if {[file exists $alertsfile] && ![file exists $lockfile]} { handle_alerts } } 

Проще говоря, он ожидает (опять-таки, максимум 20 с) удаления файла блокировки, он существует, затем открывает файл, читает его (разбивая его на строки, так как каждое предупреждение находится в отдельной строке), закрывает его и затем использует программу TTS (espeak) для чтения предупреждений. Затем он удаляет файл блокировки (~ / .alertlock) и файл предупреждений (~ / .alerts).

Какой сценарий у вас работает? confetti 6 лет назад 1
Это звучит как разумное решение, если честно. Но если сценарии не слишком длинные и не слишком сложные, имеет смысл опубликовать их здесь как справочные материалы для всех. JakeGould 6 лет назад 0
Почему в примере использования перед сценарием упоминается GoFundMe? Я мог бы так же легко выбрать любой другой пример из этого файла правил procmail ... Я просто выбрал один сверху. Вот и все. Просто пример, который я выбрал прямо в верхней части файла. GTbrewer 6 лет назад 0

Похожие вопросы