звук в cron

Автор FiveFiveFive, 02 ноября 2019, 11:28:02

« назад - далее »

0 Пользователи и 1 гость просматривают эту тему.

FiveFiveFive

Привет всему доброму сообществу.
как всегда тут пишут непонятки и вопросы. самый главный вопрос как в россии. где копать и что делать?
задача чтобы в скрипте cron под рутом проигрывался звучёк для уведомлений. сам крон работает вроде бы нормально. с ним вопросов нет. самое главное что он отробатывает, а непонятные уведомления это пока не важно. в нужном мне скрипте я написал подобное в двух вариантах.
aplay /MySound.wav или paplay /MySound.wav
и по скольку задача крона была поставлена под рутом, то в ответ тишына. вот это и есть основная проблема сейчас. соответственно я стал искать решения самостоятельно. оказалось всё не однозначно. перерыл многое перепробовал различные варианты которые предлагались во всемирной, но всё таки пришлось обращаться к более разумным. итак упращённая задача, которая почему-то не работает?
под рутом пишу crontab -e вписываю * * * * * aplay /MySound.wav &> /tmp/MyLog.txt или * * * * * paplay /MySound.wav &> /tmp/MyLog.txt и в ответ каждую минуту тишина. самое что интерестное что файл вывода пуст. тоесть он создаётся, но он пуст? ладно команда paplay, она молчащая, но ведь и от aplay тожэе ничего. хотя когда запускаещь её в терминале она отчитывается.
я подумал что проблемма в доступе к звуковой карте и поэтому попробовал поправить права. в файле /etc/group поправил строки audio:x:29:pulse,My и pulse-access:x:114: на audio:x:29:root,pulse,My и pulse-access:x:114:root. не помогло.
на убунтовских и арч форумах посоветовали определить такие переменные: PULSE_SERVER=127.0.0.1 и XDG_RUNTIME_DIR=/run/user/1000 перед вызовом команды paplay. но результат прежний. в самом терминале под рутом это всё отрабатывает, а вот в кроне вопрос?
далее я выскочил на оффицыальный сайт пулса для арч https://www.linuxsecrets.com/archlinux-wiki/wiki.archlinux.org/index.php%3Ftitle=PulseAudio&mobileaction=toggle_view_desktop.html где буквально в разделе 7.2 английскими буковками написано как запустить paplay в cron. для этого в начале надо было определить переменную XDG_RUNTIME_DIR. но я это ужэ пробовал.
у меня buster с последними обновлениями по сегодняшний день. вот что пишут логи. так как задания выполнялись каждую минуту то повторяющиеся строки я убрал чтоб не засорятся. на всех моих этапах картина примерно такая:
systemctl status cron
ноя 02 18:03:01 SrvTwo CRON[6629]: (root) CMD (/MyScript)
ноя 02 18:03:01 SrvTwo CRON[6628]: (CRON) info (No MTA installed, discarding output) # смущает вот эта строка? можэт в ней дело? но скрипт то отрабатывает.
ноя 02 18:03:01 SrvTwo CRON[6628]: pam_unix(cron:session): session closed for user root
ноя 02 18:03:01 SrvTwo CRON[6627]: (CRON) info (No MTA installed, discarding output)
ноя 02 18:03:01 SrvTwo CRON[6627]: pam_unix(cron:session): session closed for user root
grep CRON /var/log/syslog
Nov  2 18:07:01 SrvTwo CRON[6745]: (root) CMD (/MyScript)
Nov  2 18:07:01 SrvTwo CRON[6744]: (CRON) info (No MTA installed, discarding output)
Nov  2 18:07:01 SrvTwo CRON[6743]: (CRON) info (No MTA installed, discarding output)
grep -i cron /var/log/auth.log
Nov  2 18:10:01 SrvTwo CRON[6852]: pam_unix(cron:session): session opened for user root by (uid=0)
Nov  2 18:10:01 SrvTwo CRON[6852]: pam_unix(cron:session): session closed for user root
Nov  2 18:10:01 SrvTwo CRON[6851]: pam_unix(cron:session): session closed for user root
grep cron /var/log/messages
ничего не давало.
Вобщем я в потерянной прастрацыии. если уж рецепты из афицыального документа не помогают. то я точто в накдауне. надеюсь на более светлые головы чем моя...
всем откликнувшимся за ранее спасибо!

endru

а можно было расписать сначала сам вопрос, а потом в оффтоп запихнуть всю вашу боль?
если в терминале работает от рута, может стоит тогда указывать полный путь до исполняемого файла? явно каких то переменных окружения не хватает. сравнивай.

FiveFiveFive

привет всем. здравствуйте endru. я несколько разпрочитывал правила форума, но так и не понял в чём вы меня упрекнули? у меня ничего не болит. просто обратился к уважаемому сообществу с очередной проблеммой в дебиане в которой дажэ аффицыальная документацыя не помогает. "полный путь до исполняемого файла" все пути правильные. пробовал просто с командами и пробовал с прописыванием полных путей к исполняемым файлам результат прежний. "каких то переменных окружения не хватает" то что чегото не хватает это и есть данный вопрос. а вот чего и где? кто бы меня направил в нужном направлении? пробовал ещё в проигрывающих командах явно указывать устройства воспроизведения, но подобные советы с других форумов с подобной проблеммой тожэ не подошли. где бы ещё почитать и поковырять? всем всего доброго.

ecc83

Вам обязательно запускать звуки от root?

Покажите вывод:

sudo cat /etc/crontab

Какой строкой в cron вы запускаете свой скрипт?

FiveFiveFive

здравствуйте всем. здравствуйте ecc83. "Покажите вывод" Вот он "# /etc/crontab: system-wide crontab
# Unlike any other crontab you don't have to run the `crontab'
# command to install the new version when you edit this file
# and files in /etc/cron.d. These files also have username fields,
# that none of the other crontabs do.

SHELL=/bin/sh
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin

# Example of job definition:
# .- minute (0 - 59)
# | .- hour (0 - 23)
# | | .- day of month (1 - 31)
# | | | .- month (1 - 12) OR jan,feb,mar,apr ...
# | | | | .- day of week (0 - 6) (Sunday=0 or 7) OR sun,mon,tue,wed,thu,fri,sat
# | | | | |
# * * * * * user-name command to be executed
17 * * * * root cd / && run-parts -report /etc/cron.hourly
25 6 * * * root test -x /usr/sbin/anacron || ( cd / && run-parts -report /etc/cron.daily )
47 6 * * 7 root test -x /usr/sbin/anacron || ( cd / && run-parts -report /etc/cron.weekly )
52 6 1 * * root test -x /usr/sbin/anacron || ( cd / && run-parts -report /etc/cron.monthly )
". нет этот файл по умолчанию. его я не трогал. наверное вы бы хотели уточнить вот это.
"cat /var/spool/cron/crontabs/root" вывод
"* * * * * /home/My/Scripts/Linux/Play.sh
* * * * * bash '/home/My/Scripts/Linux/PreventPower.bash'
" последняя строка , как полагается, пуста. все пути правильные. всё перепроверил все скрипты отрабатывают нормально, за исключением вывода звука. "Какой строкой в cron вы запускаете свой скрипт" первой. "Вам обязательно запускать звуки от root?" желательно. потому как собираюсь всунуть команды управляющие сервисами и отправку самой машины в разные состояния. конечно это можно для пользователя разрешить команды с повышенными привелегиями, но просто под рутом этих повышений прав доступа удалось бы избежать. сейчас попробовал организовать эту задачу под пользователем, проверки ради. и опять тишина. странно почему не перехватывается вывод команд "&>". было бы хоть что-нибуть понятнее. а так по прежнему перенаправление вывода пусто и логи ничего полезного не сообщают. буду ковыряться дальше. всем удачи.

ecc83

#5
Исправьте свой файл так:

sudo crontab -e


SHELL=/bin/sh
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/home/My/Scripts/Linux

* * * * * /home/My/Scripts/Linux/Play.sh 2> /tmp/MyLog.txt
#


В последней строке оставьте одну "решётку".

FiveFiveFive

ура! процесс пошол. двойное спасибо ecc83.
правда пока заработало под простым пользователем. под рутом по прежнему тишина. хотя с вашей помощью прогресс явный, но основной вопрос по прежнему открыт. как получить звук именно под рутом? сам скрипт play выглядет так.
#!/bin/sh
export XDG_RUNTIME_DIR=/run/user/1000
paplay --client-name=My --volume=65536 '/usr/share/sounds/555/MediaXp/Windows XP Battery Low.wav'
вот что выдаёт 2> MyLog.txt
XDG_RUNTIME_DIR (/run/user/1000) is not owned by us (uid 0), but by uid 1000! (This could e g happen if you try to connect to a non-root PulseAudio as a root user, over the native protocol. Don't do that.)
Ошибка подключения: Соединение отвергнуто
Произошла ошибка при выполнении pa_context_connect(): Соединение отвергнуто
по всей видимости команде почему-то ненравиться делать подключение под рутом по собственному протоколу. и совет так не делать. тогда вопрос, а как надо?
всем удачи.

ecc83

Цитата: FiveFiveFive от 04 ноября 2019, 20:04:25вопрос, а как надо?

Убери скрипт и запускай звуковой файл напрямую:


SHELL=/bin/sh
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/home/My/Scripts/Linux

* * * * * aplay '/usr/share/sounds/555/MediaXp/Windows XP Battery Low.wav' 2> /tmp/MyLog.txt
#


FiveFiveFive

привет всем. большое спасибо ecc83.
"Убери скрипт и запускай звуковой файл напрямую" тогда теряется весь смысл озвучки в кроне под рутом. веть просто звуки можно и послушать под простым пользователем. а я хочу добавить звуковое оповещение к некоторым системным задачам. но за советы всё равно благодарю, потому как иммено по вашим советом проблемма ну или задача была решена вот так:
в самом скрипте пишим, без всяких лишних переменных.
#!/bin/bash
aplay звуковой файл
paplay звуковой файл
и обе команды будут петь и танцевать если под рутом в кроне написатьнекоторые дополнительные переменные .
SHELL=/usr/bin/bash # чистый шэл мне не очень подходит.
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/home/My/Scripts/Linux
XAUTHORITY=/root/.Xauthority № странная переменная, про неё я ничего не знаю.
DISPLAY=:0.0 № а это вообще непонятно, каким боком она относится к звуку, ну да ладно.
* * * * * Play.bash
всё работает нормально. если кому-то надо, не забываем благодарить отзывчевых людей! а я пошёл грызть свою старую задачу.

ecc83

Цитата: FiveFiveFive от 05 ноября 2019, 13:07:02"Убери скрипт и запускай звуковой файл напрямую" тогда теряется весь смысл озвучки в кроне под рутом.

Тогда убери или исправь в скрипте переменную:

export XDG_RUNTIME_DIR=/run/user/1000

Потому что она не соответствует пользователю root.

Удачи.