我已经设置了一个测试脚本来播放视频VLC-3.0.12
(曼扎罗)使用crontab
(克罗尼-1.5.7)。有问题的文件如下所示:
#!/bin/bash
## YES, I'M RICKROLLING MYSELF FOR TESTING
[[ "$HOME" != "/home/drjeff16" ]] && exit 1
[[ -n "$(pgrep vlc)" ]] && exit 1
# SINCE CRON DOES NOT SET THE EXISTING X11 ENV VARS, SET THE DISPLAY MANUALLY
DISPLAY=:0.0
if [[ "$isCron" == "0" ]] ; then # IF RUNNING FROM REGULAR TERMINAL ENVIRONMENT
echo '[[ -n "$(pgrep vlc)" ]] && killall vlc' | /usr/bin/at now + 5 minutes
nhp vlc "$HOME"/Videos/Music/Never-Gonna-Give-You-Up.mp4 # 'nhp' IS 'nohup <command> &!' AS AN EXPORTED
# FUNCTION TO AVOID APPS HIJACKING MY TERMINAL
exit 0
elif [[ "$isCron" == "1" ]] ; then # ELSE IF RUNNING FROM CRONTAB ($isCron IS 1 ON CRON ENV)
echo '[[ -n "$(pgrep vlc)" ]] && killall vlc' | /usr/bin/at now + 5 minutes
vlc "$HOME"/Videos/Music/Never-Gonna-Give-You-Up.mp4
exit 0
fi
exit 1
从我的正常环境执行此脚本不会导致任何问题。但是,当从 运行它时crontab
,VLC 确实运行并显示视频,但任何地方都没有音频输出。
在阅读 VLC 的手册条目时,我在以下部分man vlc
遇到了该变量:$OSSAUDIO_DEV
ENVIRONMENT VARIABLES
.
.
OSSAUDIO_DEV
The default audio output device, used by the OSSv4 output plugin.
.
.
$OSSAUDIO_DEV
我的问题是我是否需要在我的环境中手动设置变量,或者是否有另一个与、或我的crontab
变量有关的变量ALSA
Pulseaudio
dbus
变量,或者是否必须在我的环境中手动声明与 、 或我的会话定时任务文件:
# * * * * * Command_to_execute
# | | | | |
# | | | | Day of the Week ( 0 - 6 ) ( Sunday = 0 )
# | | | |
# | | | Month ( 1 - 12 )
# | | |
# | | Day of Month ( 1 - 31 )
# | |
# | Hour ( 0 - 23 )
# |
# Min ( 0 - 59 )
SHELL=/bin/bash
HOME=/home/drjeff16
DISPLAY=:0.0
.
.
.
EDITOR="$(cat $HOME/.editor)"
isCron=1
.
.
.
答案1
这是我的样板cron
答案,希望其中有帮助。
通过cron
、 或at
、 或运行的作业batch
不会在桌面上的同一运行时环境中运行。您的任何PATH
更改或其他环境变量设置都不会自动传播到您的cron
作业。例如,没有$DISPLAY
,因此 GUI 程序需要特殊处理(读取man xhost
)。
可以在Read 文件cron
中为所有作业设置环境变量。crontab
man 5 crontab
echo "=== set ===";set;echo "=== env ===";env | sort;echo "=== alias ===";alias
查看每个环境中的结果 。
由于默认情况下,command
该行的部分由 解释,其语法比 更简单,因此我建议调用脚本(可执行文件,已安装,以 7 开头)来设置环境,然后调用所需的程序。crontab
/bin/sh
/bin/bash
command
bash
#!/bin/bash
答案2
你可以尝试定义XDG。例如:
* * * * * XDG_RUNTIME_DIR=/run/user/$(id -u) /path/to/script
声音开始为我工作。不要忘记编辑作业计时 (* * * * *),这样它就不会每分钟运行一次。