从 Crontab 执行时,Bash 脚本的行为有所不同:编辑 - Pulseaudio 的环境变量问题

从 Crontab 执行时,Bash 脚本的行为有所不同:编辑 - Pulseaudio 的环境变量问题

我有一个手动执行得非常好的脚本,尽管 Cron 完全忽略了两个命令(这只是一个片段):

sinkint=$(pacmd list-sinks | sed -n '/index\W [1-9]/p' | sed 's/.*://g;s/\W//g')

pacmd set-default sink $sinkint
pacmd set-sink-volume $sinkint 20%

定时任务

* * * * * /path/to/script arg1 >> /path/to/log

错误信息

No PulseAudio daemon running, or not running as session daemon.
No PulseAudio daemon running, or not running as session daemon.
You have to specify a sink name/index and a volume

编辑:

尝试了脚本中的变量

export PULSE_SERVER=unix:/tmp/pulse-socket
export PULSE_COOKIE=/tmp/pa_cookie

我的 /etc/pulse/default.pa 中的套接字

load-module module-native-protocol-unix socket=/tmp/pulse-socket

我的 /etc/pulse/client.conf 中的套接字和 cookie

default-server = unix:/tmp/pulse-socket
cookie-file = /tmp/pa_cookie

crontab -e

PULSE_SERVER=unix:/tmp/pulse-socket
PULSE_COOKIE=/tmp/pa_cookie

* * * * * /path/to/script arg1 2> /path/to/log

答案1

添加XDG_RUNTIME_DIR=/run/user/1000到 crontab 有效!

很烦人...因为这实际上是我唯一需要的环境变量。哦,好吧,如果将来有人需要答案 - 我想这就是答案。

答案2

作业通过 运行cron,或者systemd启动脚本不在桌面上运行的同一运行时环境中运行。systemd启动脚本作为root.您的任何PATH更改或其他环境变量设置都不会~/.bashrc自动传播到您的cron作业。例如,没有$DISPLAY,因此 GUI 程序需要特殊处理(读取man xhost)。

可以在Read 文件cron中为所有作业设置环境变量。crontabman 5 crontab

echo "=== id ===";id;echo "=== set ===";set;echo "=== env ===";env | sort;echo "=== alias ===";alias查看每个环境中的结果 。

由于默认情况下,command该行的部分由 解释,它的语法比 更简单,因此我建议调用一个脚本(可执行文件,已安装,以 开头)来设置环境,然后调用所需的程序。crontab/bin/sh/bin/bashcommandbash#!/bin/bash

相关内容