pacmd - почему не работает cron?

1

Я использую следующее, чтобы проверить, пишет ли какая-либо программа в приемники pulseaudio:

pacmd list-sink-inputs

Это прекрасно работает прямо с терминала. Это дает мне такой вывод:

1 sink input(s) available.
    index: 4
    driver: <protocol-native.c>
    flags: START_CORKED 
    state: RUNNING
    sink: 0 <alsa_output.pci-0000_00_1b.0.analog-stereo>
    volume: front-left: 24144 /  37% / -26.02 dB,   front-right: 24144 /  37% / -26.02 dB
            balance 0.00
    muted: no
    current latency: 59.33 ms
    requested latency: 25.00 ms
    sample spec: float32le 2ch 48000Hz
    channel map: front-left,front-right
                 Stereo
    resample method: copy
    module: 7
    client: 3 <Firefox>
    properties:
        media.name = "AudioStream"
        application.name = "Firefox"
        native-protocol.peer = "UNIX socket client"
        native-protocol.version = "30"
        application.process.id = "1241"
        application.process.user = "balajeerc"
        application.process.host = "smallguy"
        application.process.binary = "firefox"
        application.language = "en_IN"
        window.x11.display = ":0"
        application.process.machine_id = "82f34b545d7441ad9439148d54b19c2e"
        application.process.session_id = "c2"
        application.icon_name = "firefox"
        module-stream-restore.id = "sink-input-by-application-name:Firefox"

Однако, когда я запускаю это как часть задания cron, он ничего не дает (пустая строка), даже когда воспроизводится звук.

Почему это так?

РЕДАКТИРОВАТЬ: В ответ на некоторые из комментариев ниже, я попробовал еще пару вещей. Теперь я запускаю его с полным путем и ошибкой ведения журнала, используя:

/usr/bin/pacmd list-sink-inputs >> $LOG_FILE 2>&1

Это выдает следующий журнал, который, по сути, печатается в stderr, так как stdout, как я упоминал ранее, пуст:

No PulseAudio daemon running, or not running as session daemon.

Моя запись в crontab выглядит следующим образом:

*/2 * * * * /home/balajeerc/.i3/utils/idle_check_suspend.sh

Это пользовательская запись в crontab, а не root.

где idle_check_suspend.shскрипт где мой вызов pacmd

Системная информация:

Kernel version: 4.8.0-49-generic
Ubuntu 16.04

pacmd 8.0
Compiled with libpulse 8.0.0
Linked with libpulse 8.0.0
balajeerc
источник
Что именно ваша crontabзапись? Я подозреваю, что проблема вызвана различиями между вашей оболочкой и тем, в котором выполняются команды cron. Это стоит в том числе полный путь к pacmdи перенаправлять как stdoutи stderr.
AFH
@AFH Опробовал то, что вы проверили, и обновил мой пост.
balajeerc
Я наблюдаю точно так же, как и вы, с подобным тестом, но я действительно изо всех сил пытаюсь добраться до сути. Действительно, в прошлом у меня было так много проблем с тем, cronчто я писал свои собственные bashсценарии для замены, и теперь я запускаю это в терминале при запуске. Я пробовал много тестов в cron: whoamiпоказывает мое имя пользователя, и echo ~ $PWDоба показывают мой домашний каталог; /usr/bin/pacmd list-sink-inputs >> $LOG_FILE 2>&1показывает No PulseAudio daemon running, or not running as session daemon., что тот же ответ, который я получаю от корневого терминала. (продолжение)
AFH
Единственная подсказка заключается в том, ps -flчто cronсценарий выполняется с привилегиями суперпользователя, хотя вызываемый psвыполняется нормально (как и psиз корневого терминала) и отображается pulseaudioв списке процессов с флагом 1( forked but didn't exec). Я не могу понять это в данный момент, но ваш вопрос заслуживает голосования.
AFH
На данный момент лучшее, что я могу предложить, это обходной путь: закомментируйте crontabстроку, запустите новый терминал, затем запустите while sleep 120; do /home/balajeerc/.i3/utils/idle_check_suspend.sh; done- я предлагаю вам свести его к минимуму в редко используемом рабочем пространстве, чтобы вы могли забыть об этом.
AFH

Ответы:

1

В целях безопасности и удобства в большинстве дистрибутивов pulseaudio использует встроенное хранилище вашего пользователя в / run / user / для своих элементов управления демоном. В cron не установлены соответствующие переменные окружения, поэтому он не знает, какой путь использовать. Вам нужно будет установить его следующим образом в вашем скрипте:

export PULSE_RUNTIME_PATH="/run/user/$(id -u)/pulse/"

Если это не путь по умолчанию, вы также можете вызвать переменную $ PULSE_RUNTIME_PATH, чтобы узнать, куда она указывает в данный момент.

zaTricky
источник
0

Вам, вероятно, нужно указать полный путь к программе pacmd, скорее всего /usr/local/bin/pacmd

mayersdesign
источник
2
Попробовал это. Это не сработало. Обновил мой пост с результатом попытки этого.
balajeerc
0

Команды pacmd работают в командах терминала сеанса пользователя, но могут иметь проблемы с доступом к демону pulseaudio при использовании в сценариях оболочки

изменить команду в скрипте для эквивалентной команды pactl

pactl list sink-inputs

поскольку скрипт проверяет нулевой ответ, чтобы подтвердить отсутствие активных входов приемника, может потребоваться только сокращенный (возможно, более быстрый) ответ из:

pactl list short sink-inputs

pactl list short sink-inputs

ник гномик
источник