我在 中放入了一个可执行脚本/etc/cron.hourly,但该脚本并不是每小时运行一次,实际上它根本没有运行。
这是我制作的脚本(小时声音):
#!/bin/bash mplayer ~/Music/sfx_msg-highlight.wv &> /dev/null & spd-say -r -50 -p 50 -t male3 "现在是 $(date +"%l %p")" 通知发送“它是:”“$(date +"%l %p") 现在。-i ~/Pictures/"first tee.png" -t 5000
我的 crontab 是:
DISPLAY=":0.0"
XAUTHORITY="/home/naruto/.Xauthority"
XDG_RUNTIME_DIR="/run/user/1000"
0 * * * * /home/naruto/Hour-sound.sh
Run Code Online (Sandbox Code Playgroud)
虽然mplayer和spd-say命令运行正确,但notify-send不是。我还尝试将错误重定向到文件:
0 * * * * /home/naruto/Hour-sound.sh 2>/tmp/error
Run Code Online (Sandbox Code Playgroud)
但这显示没有输出。我究竟做错了什么?
Hen*_*eck 31
正如您在问题的评论中可能已经看到的那样,/etc/cron.hourly(以及其他类似目录)中的 cronjobs由run-parts. run-parts对文件名有点挑剔。默认情况下,它不会执行文件名包含除(所有来自 ASCII 的所有文件)以外的任何内容的文件
因此,如果您的脚本具有例如“myscript.sh”的文件名,则它会被忽略,因为run-parts它不喜欢点。
一个问题是您试图notify-send从 cron运行图形应用程序 ( )。这需要稍微调整一下。您需要在 crontab 中设置XAUTHORITY和DISPLAY变量,以便它可以连接到您正在运行的 X 会话,并且您需要设置XDG_RUNTIME_DIR以便它可以连接到您的pulseaudio 会话。不幸的是,这些需要在 crontab 本身中设置,因此您不能使用/etc/cron.hourly. 相反,运行crontab -e并添加这些行:
DISPLAY=":0.0"
XAUTHORITY="/home/YOURUSERNAME/.Xauthority"
XDG_RUNTIME_DIR="/run/user/1000"
0 * * * * /path/to/script.sh
Run Code Online (Sandbox Code Playgroud)
将 的值更改为从终端XDG_RUNTIME_DIR返回时返回的任何值 echo。在我的系统上,这是:
$ echo $XDG_RUNTIME_DIR
/run/user/1001
Run Code Online (Sandbox Code Playgroud)
它可能与您的相同,但请先检查。现在,您的脚本将每小时运行一次,并且应该按预期工作。