我把一个可执行脚本放进去了/etc/cron.hourly
,但这个脚本并不是每小时运行一次,实际上它根本就没运行过。
下面是我编写的脚本(Hour-sound):
/bin/bash #!/bin/bash mplayer ~/音乐/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
虽然mplayer
和spd-say
命令可以正确运行,但notify-send
不能。我还尝试将错误重定向到文件:
0 * * * * /home/naruto/Hour-sound.sh 2>/tmp/error
但没有输出。我做错了什么?
答案1
您可能已经在问题的评论中看到, 中的 cronjobs /etc/cron.hourly
(以及其他类似的目录) 由 执行run-parts
。run-parts
对文件名有点挑剔。 默认情况下,它不会执行文件名包含除 (所有来自 ASCII 的文件) 之外的任何内容的文件
- 大写字母
- 小写字母
- 数字
- 下划线
- 破折号(“减号”)
因此,如果您的脚本的文件名例如为“myscript.sh”,它将被忽略,因为run-parts
它不喜欢点。
答案2
一个问题是,您正尝试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
将的值更改 为从终端XDG_RUNTIME_DIR
返回的值。在我的系统上,这是:echo
$ echo $XDG_RUNTIME_DIR
/run/user/1001
您的脚本可能也一样,但请先检查一下。现在,您的脚本将每小时运行一次,并且应该可以正常工作。
答案3
以下列结尾的脚本.sh
不会在/etc/cron.hourly
文件夹中执行:
https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=308911
如果出现以下情况,由 run-pars 处理的目录内的链接或二进制文件(如 /etc/cron.daily)将不会运行:时期是他们名字的一部分。
重命名脚本
mv /etc/cron.hourly/Hour-sound.sh /etc/cron.hourly/Hour-sound
或者把脚本调用放入
/etc/crontab
这使得.sh
结局
答案4
对已接受答案的补充。
您可以首先测试您的脚本/etc/cron.*
以确保它将被执行。
例如,您有此脚本:/etc/cron.hourly/sample-script
。执行以下命令来检查它是否被接受run-parts
:
run-parts --test /etc/cron.hourly
输出应该是这样的:
/etc/cron.hourly/sample-script
/etc/cron.hourly/some-other-script
...
如果您的脚本在输出中列出,那么您就可以开始了。