pacmd - 为什么它不能从 cron 运行?

pacmd - 为什么它不能从 cron 运行?

我正在使用以下方法检查是否有任何程序正在写入 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

答案1

为了安全和方便起见,大多数发行版都让 pulseaudio 使用用户的内置临时存储作为其守护进程控件(通常在 /run/user/ 中)。在 cron 中,它没有设置相关的环境变量,因此它不知道要使用什么路径。您需要在脚本中为其提供一些参考信息:

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

或者,根据textshell 的建议,如果您的系统通常不设置 PULSE_RUNTIME_PATH,则 pulseaudio 可以使用 XDG_RUNTIME_DIR 环境变量:

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

要验证上述变量,请在正常已知工作的 shell 会话中回显它们:

$ echo ${XDG_RUNTIME_DIR}
/run/user/1000
$ echo ${PULSE_RUNTIME_PATH}
/run/user/1000/pulse/
$

答案2

您可能需要指定 pacmd 程序的完整路径,可能/usr/local/bin/pacmd

答案3

pacmd 命令可以在用户会话终端命令中使用,但在 shell 脚本中使用时可能会出现访问 pulseaudio 守护进程的问题

将脚本中的命令更改为等效的 pactl 命令

pactl list sink-inputs

由于脚本正在检查空响应以确认没有活动的接收输入,因此可能只需要缩短(可能更快)的响应:

pactl list short sink-inputs

pactl list short sink-inputs

答案4

pulseaudio 服务器/守护进程是按用户运行的,但 crontab 以 root 身份运行。因此,当 crontab 以 root 身份运行 pacmd 时,没有为 root 运行的服务器,因此无法接收命令。因此,您必须使用用户的 crontab 而不是系统 crontab,或者以您认为将登录的用户身份运行脚本。

相关内容