无法让 cron.hourly 工作

无法让 cron.hourly 工作

我使用 sudo apt-get install cron 安装了 cron,以 root 身份启动它,并确认它正在运行

ps -ef

然后我创建了一个简单的脚本,其内容如下:

touch /home/username/cron-test.txt

我使这个脚本文件可执行并将其放入

mv cron-test.sh /etc/cron.hourly

但是由于某种原因,它没有被执行,文件也没有被创建。我尝试手动运行它,它可以工作。

我也尝试了其他 cron 脚本,但它们似乎不起作用。我是否遗漏了什么,或者我使用 cron 的方式是否不正确?

我的系统是 Ubuntu 10.10,我的托管商已经将其精简,因此它只安装了几个进程(甚至没有 cron)。

答案1

尝试将其添加#! /bin/sh到脚本的第一行并删除扩展名,这样名称就是/etc/cron.hourly/cron-test

我记得在某处读到过,cron 不会运行带有扩展名的文件,因为当文件/ect/crontab包含以下内容时它会使用 runparts:

# /etc/crontab: system-wide crontab
# Unlike any other crontab you don't have to run the `crontab'
# command to install the new version when you edit this file
# and files in /etc/cron.d. These files also have username fields,
# that none of the other crontabs do.

SHELL=/bin/sh
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin

# m h dom mon dow user  command
17 *    * * *   root    cd / && run-parts --report /etc/cron.hourly
25 6    * * *   root    test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.daily )
47 6    * * 7   root    test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.weekly )
52 6    1 * *   root    test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.monthly )

以上是我/etc/crontab在 Ubuntu 10.04 上的内容,安装了 cron(我没有编辑过这个文件)

由于/etc/crontab文件使用run-parts,文件名非常严格,如下(感谢 Matteo):

run-parts runs a number of scripts or programs found in a single directory 
directory. Filenames should consist entirely of upper and lower case letters,
digits, underscores, and hyphens. Subdirectories of directory and files with
other names will be silently ignored. Scripts must follow the
#!/bin/interpretername convention in order to be executed. They will not
automatically be executed by /bin/sh. The files found will be run in the
lexical sort order of the filenames.

答案2

以下是来自 run-parts 手册页的一段引文:

文件名应完全由大小写字母、数字、下划线和连字符组成。

问题是,您在文件名中包含了一个“.”(就在“txt”之前)。该句点与 run-parts 用于查找脚本的文件名模式不匹配。

请记住,文件扩展名不是文件系统的一部分!您添加的任何文件扩展名都只是文件名的一部分,因此当规则说“文件名”时,它包括句点和扩展名。

更远,

脚本必须遵循 #!/bin/interpretername 约定才能执行。

这意味着您必须输入 #!/bin/bash 才能执行您的脚本。

相关内容