为什么将脚本放在 /etc/cron.hourly 中不起作用?

Bla*_*ock 21 scripts cron

我在 中放入了一个可执行脚本/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)

虽然mplayerspd-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它不喜欢点。

  • 我刚刚测试了一个小脚本,该脚本刚刚将“Hello”写入 /tmp 中的文件,并且它没有问题。以防万一,您是否知道`/etc/cron.hourly` 中的脚本不一定“在整点”执行?如果你在 `/etc/crontab` 中的 cronjob 在分钟位置有 17,那么脚本会在 00:17、01:17 等等执行。再次以防万一,脚本的权限允许用户 root 执行它们? (2认同)

ter*_*don 5

一个问题是您试图notify-send从 cron运行图形应用程序 ( )。这需要稍微调整一下。您需要在 crontab 中设置XAUTHORITYDISPLAY变量,以便它可以连接到您正在运行的 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)

它可能与您的相同,但请先检查。现在,您的脚本将每小时运行一次,并且应该按预期工作。