验证 crontab 是否正常工作

我想要验证某个特定的crontab是否正常工作。我已经添加了一个类似这样的任务:
  */2 * * * * /path_to_my_php_script/info.php >/dev/null 2>&1

我知道我重定向到了空设备,但我不确定上面的命令是否正确。
*编辑1:在我的/var/log/syslog中,每两分钟我都会遇到以下错误:
 (CRON) error (grandchild #2788 failed with exit status 2)

*编辑 2:此新工作日志中没有错误:

 */2 * * * * /usr/bin/php /path_to_my_php_script/info.php >/dev/null 2>&1

很不幸,我尝试了上述的方法,但对我来说都没有起作用。就像你所说的那样,试用命令/bin/sh -c "(export PATH=/bin; /tmp/trial.sh </dev/null)"显示了下面的信息,我不确定这是什么意思:/bin/sh: PATH=/bin: is not an identifier. - user284525
9个回答

虽然很少见,但有时cron服务在运行时可能无法正常工作。以下是验证crond是否正在运行以及停止/启动服务的方法。
使用systemctl命令:
systemctl status cron
systemctl restart cron

旧方法: 在CentOS和其他基于Red Hat的系统上:
service crond status
service crond stop
service crond start

在Ubuntu和其他基于Debian的系统上:
service cron status
service cron stop
service cron start

2在我的机器上看起来是/etc/init.d/cron status - mpen
@mpen service 是为了 systemd(被许多 Linux 发行版采用)而设计的。旧版本和一些发行版可能仍在使用位于 /etc/init.d 的旧 System V 脚本。 - mrm
这件事发生在我使用Docker机器上。 在尝试更复杂的解决方案之前,我会先检查这个。 - ruizfrontend
也适用于WSL2 - marcin2x4
1systemctl status cron - 井上智文

crontab条目的语法看起来是正确的。确实,如果您使用“crontab -e”编辑您的crontab(正如您应该那样),如果指定了一个语法无效的crontab条目,您将会收到一个错误提示。
首先,从命令行运行/path_to_my_php_script/info.php是否正确?
如果是的话,它也能像这样正确运行吗?:
/bin/sh -c "(export PATH=/usr/bin:/bin; /path_to_my_php_script/info.php </dev/null)"

如果那样可以工作,它会像这样工作吗?
/bin/sh -c "(export PATH=/usr/bin:/bin; /path_to_my_php_script/info.php </dev/null >/dev/null 2>&1)"

第三步与cron运行程序的方式类似(如在“man 5 cron"中所述)。

你可能遇到的最常见问题是cron用于运行程序的PATH太受限制。因此,你可能希望在crontab条目的顶部添加类似以下内容的内容(你需要添加脚本所需的任何目录):

PATH=~/bin:/usr/bin/:/bin

请注意,cron默认使用的是/bin/sh而不是bash。如果您需要使用bash,请在您的crontab文件开头添加以下内容:
SHELL=/bin/bash

请注意,这两个更改将影响所有的crontab条目。如果你只想修改info.php程序的这些值,你可以这样做:
*/2 * * * * /bin/bash -c ". ~/.bashrc; /path_to_my_php_script/info.php"

值得一提的是,在配置为“邮件”(也就是说,已经配置了MTA [sendmail/postfix等]的系统)的系统上,所有来自crontab程序的输出都会自动通过电子邮件发送给您。默认的Ubuntu桌面系统不会配置本地邮件,但如果您在服务器上工作,只需在终端中输入“mail”即可查看所有这些cron邮件。这也适用于“at”命令。

2我在第二步遇到了权限被拒绝的问题。我该怎么办? - akikara
1@akikara chmod +x ./cron.sh - 显然,将./cron.sh替换为您要运行的文件的位置 - Tisch

不要将错误输出重定向到/dev/null,并在/var/log/syslog中使用grep查找cron的输出。
grep cron /var/log/syslog

你可以在编辑了/etc/crontab/etc/cron.d/下的文件后保存时立即显示错误。
tail -f /var/log/syslog | grep --line-buffered cron

如果编辑没有问题,你只会看到“重新加载”提示,如果有错误,会出现错误。
Jul 9 09:39:01 vm cron[1129]: Error: bad day-of-month; while reading /etc/cron.d/new 

你可以使用终端命令查看你的活动cron。
crontab -l

以下是参数的顺序:
1. 分钟(0 - 59) 2. 小时(0 - 23) 3. 日期(1 - 31) 4. 月份(1 - 12) 5. 星期几(0 - 6)(星期日为0) 6. 命令
因此,你的脚本每小时的第一分钟被调用。为了测试目的,你应该以更频繁的间隔测试输出结果。
* * * * * <command> #Runs every minute

这将每分钟调用它!

1*/2 * * * * 我已经改成每两分钟一次了 - croppio.com

老问题,答案很复杂。最简单的方法是将这行代码添加到你的crontab中。
* * * * * /bin/bash -l -c 'date > ~/cron-test.txt'

每分钟将当前日期写入文件~/cron-test.txt
然后只需运行cat ~/cron-test.txt,并检查显示的日期是否为当前日期。如果是,则表示crontab正常工作。

每一行的时间部分,您可以使用cron tester来测试/验证您的cron时间定义。

2此外,还有一个非常有用的网站:http://www.crontab-generator.org/ - rubo77
无法访问的链接到cron测试工具 - Seamus
@Seamus 链接现在已经失效了,但是我回答的时候还没有问题,所以请不要给我投反对票。 - Ashish Karpe
如果这里有任何有价值的东西 - 除了一个指向答案的链接,我就不会给你点踩。但是没有那个链接,你的回答明显属于“此答案无用”的类别。很抱歉,如果你想编辑你的回答,我会很乐意再看一眼。我不喜欢点踩 - 这是我在这里近4年来的第二次点踩。 - Seamus

我相信你也可以使用run-parts来在后台运行cron作业。实际上,这就是cron自己用来运行定期cron作业的方法,所以只要提供适当的参数,你就可以随时运行它们。
如果你只想运行一个文件,而不是在例如/etc/cron.daily中定义的所有cron作业,你需要提供正则表达式参数以及一个有效的正则表达式。run-parts --list --regex '^p.*d$' /etc 请记住,cron作业通常没有扩展名,并且被标记为可执行文件,所以确保你的脚本类似,尽管使用正则表达式可能允许你触发带有扩展名的脚本。

首先,你需要检查的状态:
systemctl status cron

在那之后,在命令行中运行以下命令:
crontab -e

并将此行添加到crontab

* * * * * /bin/bash -l -c 'date >> /tmp/cron-test.txt'

这个命令会在cron-test文件中每分钟写入当前日期,您可以使用以下命令查看crontab的输出:
cat /tmp/cron-test.txt

你应该在4分钟后得到这样的输出
Mon Mar  6 11:55:01 UTC 2023
Mon Mar  6 11:56:01 UTC 2023
Mon Mar  6 11:57:01 UTC 2023
Mon Mar  6 11:58:01 UTC 2023

现在,如果你能看到这个输出,那么你的定时任务表运行正常。否则,你可以查看日志并找出问题的原因。
grep cron /var/log/syslog

完成。

啊!!
我自己找到了答案,我检查了默认安装目录即/etc/init.d/,但没有找到crond
现在我会尝试并回复。
注意 - 我也检查了cron.allowcron.deny。目前一切都正常。