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

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

我把一个可执行脚本放进去了/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

虽然mplayerspd-say命令可以正确运行,但notify-send不能。我还尝试将错误重定向到文件:

0 * * * * /home/naruto/Hour-sound.sh 2>/tmp/error

但没有输出。我做错了什么?

答案1

您可能已经在问题的评论中看到, 中的 cronjobs /etc/cron.hourly(以及其他类似的目录) 由 执行run-partsrun-parts对文件名有点挑剔。 默认情况下,它不会执行文件名包含除 (所有来自 ASCII 的文件) 之外的任何内容的文件

  • 大写字母
  • 小写字母
  • 数字
  • 下划线
  • 破折号(“减号”)

因此,如果您的脚本的文件名例如为“myscript.sh”,它将被忽略,因为run-parts它不喜欢点。

答案2

一个问题是,您正尝试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 

将的值更改 为从终端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
...

如果您的脚本在输出中列出,那么您就可以开始了。

相关内容