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


16

我在中放置了一个可执行脚本/etc/cron.hourly,但是该脚本并非每个小时都运行一次,实际上根本就没有运行过。

这是我制作的脚本(小时声音):

#!/ bin / bash
mplayer〜/ Music / sfx_msg-highlight.wv&> / dev / null&
spd-say -r -50 -p 50 -t male3“现在的时间是$(date +”%l%p“)”
notify-send“这是:”“ $(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

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


只是确保您使脚本可执行?归根所有?当您从终端运行脚本或在其中放置简单脚本时会发生什么?是否/etc/crontabrun-parts用于cron从目录运行每小时作业的行?
heemayl

可执行文件:是的,运行脚本在/etc/cron.hourly目录中没有任何问题,不知道如何检查?是在启动应用程序中吗?@heemayl
Black Block

1
请问/etc/crontab文件也行17 * * * * root cd / && run-parts --report /etc/cron.hourly
heemayl


1
不要发布文字的屏幕截图。特别是当该文本显示在透明的终端窗口中并且包含分散注意力的颜色时。
terdon 2015年

Answers:


24

正如您在问题注释中可能已经看到的那样,/etc/cron.hourly(和其他类似目录)中的cronjobs 由执行run-partsrun-parts对文件名有些挑剔。默认情况下,它不执行文件名包含除(所有来自ASCII的文件)以外的文件的文件

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

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


1-这是我的文件:mediafire.com/view/rg8r85xb7qw26zs/cron.hourly_017.png 2-您是否在/etc/cron.hourly中尝试了任何脚本并与您合作?
黑色块

2
我刚刚测试了一个小脚本,它只将“ Hello”写入到/ tmp中的文件,并且可以正常工作。以防万一,您知道其中的脚本/etc/cron.hourly不一定是“按小时执行”的吗?如果您的cronjob在/etc/crontab分钟位置有17,则脚本在00:17、01:17等执行。再次以防万一,脚本的权限允许用户root执行它们?
Henning Kockerbeck

是的,但是我的那个剧本永远不会运行。有关许可的信息,请参见此处:mediafire.com/view/psnb4bflawdly//
Black Block

也许实际上是权限问题。我知道更一般的脚本/etc/cron.d/不得具有“组”或“其他”的写入或执行权限。“所有者”需要执行权限,“组”和“其他”必须只有读取权限。也许这也适用/etc/cron.hourly,尽管我没有测试。
Henning Kockerbeck

好的,然后我更改了对我的文件mediafire.com/view/s2lq63u7z54ohbo/…的许可权,该许可权使作为根组的组是只读的,而其他人则为只读,所以这会造成任何问题吗?
黑块

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 

将值从终端更改XDG_RUNTIME_DIR为返回的值 echo。在我的系统上,这是:

$ echo $XDG_RUNTIME_DIR
/run/user/1001

可能与您的相同,但请先检查。现在,您的脚本将每小时运行一次,并且应该可以正常运行。


这就是您的意思mediafire.com/view/ucjpvu8b41n3hue/…。这对我不起作用。
黑块

我认为如果问题出在通知发送中,那么为什么其他命令也无法运行(如mplayer)呢?
黑块

@BlackBlock有多个问题。i)notify-send需要设置XAUTHORITYDISPLAY变量,ii)mplayer需要XDG_RUNTIME_DIR设置。你有没有尝试我的建议?那应该解决两个问题。您可能还因为run-parts其他答案中的解释而遇到了命名问题。
terdon 2015年

那为什么这对我不起作用?我会生气的!在对您的答案的第一评论中看到我的照片
Black Block

@BlackBlock不!您正在编辑/etc/crontab,请勿这样做。您希望此文件以您的用户身份而不是以root用户身份运行,并且该文件的格式仍然不同。只需按照我在回答中所说的那样,运行crontab -e并在其中添加行即可。
terdon 2015年

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结局


1

不要使用扩展名为(abc.sh)的脚本,也不要添加需要的位置。(cron.hours)。

将您的代码内容添加到abc文件并保存。(根据需要)(这应该是bash命令)

采用

sudo chmod +x abc

生成可执行文件的命令。

edit etc/cronrtab file

从您的分钟到小时行有预定义的几行。编辑并保存。

然后它将正常运行。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.