Я использую следующее, чтобы проверить, пишет ли какая-либо программа в приемники 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
crontab
запись? Я подозреваю, что проблема вызвана различиями между вашей оболочкой и тем, в котором выполняются командыcron
. Это стоит в том числе полный путь кpacmd
и перенаправлять какstdout
иstderr
.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.
, что тот же ответ, который я получаю от корневого терминала. (продолжение)ps -fl
чтоcron
сценарий выполняется с привилегиями суперпользователя, хотя вызываемыйps
выполняется нормально (как иps
из корневого терминала) и отображаетсяpulseaudio
в списке процессов с флагом1
(forked but didn't exec
). Я не могу понять это в данный момент, но ваш вопрос заслуживает голосования.crontab
строку, запустите новый терминал, затем запуститеwhile sleep 120; do /home/balajeerc/.i3/utils/idle_check_suspend.sh; done
- я предлагаю вам свести его к минимуму в редко используемом рабочем пространстве, чтобы вы могли забыть об этом.Ответы:
В целях безопасности и удобства в большинстве дистрибутивов pulseaudio использует встроенное хранилище вашего пользователя в / run / user / для своих элементов управления демоном. В cron не установлены соответствующие переменные окружения, поэтому он не знает, какой путь использовать. Вам нужно будет установить его следующим образом в вашем скрипте:
Если это не путь по умолчанию, вы также можете вызвать переменную $ PULSE_RUNTIME_PATH, чтобы узнать, куда она указывает в данный момент.
источник
Вам, вероятно, нужно указать полный путь к программе pacmd, скорее всего
/usr/local/bin/pacmd
источник
Команды pacmd работают в командах терминала сеанса пользователя, но могут иметь проблемы с доступом к демону pulseaudio при использовании в сценариях оболочки
изменить команду в скрипте для эквивалентной команды pactl
pactl list sink-inputs
поскольку скрипт проверяет нулевой ответ, чтобы подтвердить отсутствие активных входов приемника, может потребоваться только сокращенный (возможно, более быстрый) ответ из:
pactl list short sink-inputs
pactl list short sink-inputs
источник