时区更改后 Cron 作业不会启动

ads*_*sco 13 cron timezone

我已经尝试消除许多常见错误,

  1. 确保 PATH 可用于 cron

  2. crontab 文件末尾有一个结束线

  3. 时区通过以下方式设置:

    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 服务。

use*_*ser 7

首先,您遇到导致一个字段被错误考虑的错误的几率似乎非常低。这更有可能是对正在发生的事情和 cron 期望的误解。

在这种情况下,我们在问题的评论中发现这很可能是与时区相关的问题。为此,您将:

  • * * * * * date在 crontab 中添加一个条目
  • 从 crontab 中删除(或注释掉)任何 TZ 分配

这会强制date使用调用者的时区设置运行,这意味着 cron 守护进程。查看输出;它将显示 cron 在内部使用的时区,因此很可能它希望其时间字段位于哪个时区。如果您在 crontab 中有 TZ 分配,则很容易将 TZ 环境变量分配传递给调用命令,但 cron 本身使用其他时区。通过注释或删除 TZ 分配,您可以避免这种歧义。

另请注意,对系统全局时区设置(包括例如 /etc/localtime)的任何更改几乎肯定需要至少重新启动 cron 守护程序,并且可能(尽管不太可能)系统重新启动才能完全生效。在 crontab 中编辑 TZ 分配应该不需要重新加载 cron 守护程序,因为它应该检测到文件已更改并自动重新加载它。