我已经尝试消除许多常见错误,
确保 PATH 可用于 cron
crontab 文件末尾有一个结束线
时区通过以下方式设置:
cd /etc
cp /usr/share/zoneinfo/Asia/Singapore /etc/localtime
Run Code Online (Sandbox Code Playgroud)date
在 bash 中运行,我得到:
Tue Sep 17 15:14:30 SGT 2013
Run Code Online (Sandbox Code Playgroud)
为了检查 cron 是否同时使用,
* * * * * date >> date.txt
Run Code Online (Sandbox Code Playgroud)
在 date.txt 中给出相同的日期输出。
这是我试图执行的脚本:
event.sh
:
#!/usr/bin/env bash
echo data > /root/data.txt
Run Code Online (Sandbox Code Playgroud)
使用crontab -e
,下面的行有效,
* * * * * /bin/bash /root/event.sh >/tmp/debug.log 2>&1
15 * * * * /bin/bash /root/event.sh >/tmp/debug.log 2>&1
Run Code Online (Sandbox Code Playgroud)
但是,当我尝试其他一些参数时,希望它会在下午 2.50 运行:
50 14 * * * /bin/bash /root/event.sh >/tmp/debug.log 2>&1
Run Code Online (Sandbox Code Playgroud)
或者
50 14 * * * (cd /root ; ./event.sh >/tmp/debug.log 2>&1)
Run Code Online (Sandbox Code Playgroud)
它将不再起作用。我的小时论点似乎有问题。在/tmp/debug.log
文件中也找不到任何内容。
解决方案:
原来我必须在对 TZ 进行更改后重新启动 cron 服务。
首先,您遇到导致一个字段被错误考虑的错误的几率似乎非常低。这更有可能是对正在发生的事情和 cron 期望的误解。
在这种情况下,我们在问题的评论中发现这很可能是与时区相关的问题。为此,您将:
* * * * * date
在 crontab 中添加一个条目这会强制date
使用调用者的时区设置运行,这意味着 cron 守护进程。查看输出;它将显示 cron 在内部使用的时区,因此很可能它希望其时间字段位于哪个时区。如果您在 crontab 中有 TZ 分配,则很容易将 TZ 环境变量分配传递给调用命令,但 cron 本身使用其他时区。通过注释或删除 TZ 分配,您可以避免这种歧义。
另请注意,对系统全局时区设置(包括例如 /etc/localtime)的任何更改几乎肯定需要至少重新启动 cron 守护程序,并且可能(尽管不太可能)系统重新启动才能完全生效。在 crontab 中编辑 TZ 分配应该不需要重新加载 cron 守护程序,因为它应该检测到文件已更改并自动重新加载它。