我在 /etc/cron.d 下有一个 cron 脚本,如下所示:
SHELL=/bin/sh PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
0 0 * * * 根 /usr/local/sbin/app_logrotate >> /var/log/app-newday.log
这有效,但它总是在当地时间 00:00 执行。有问题的应用程序使用 UTC 时间(我无法更改它)。在我的时区,这比现在晚了几个小时,导致此应用程序创建的每日日志文件上的日期标签永远不是新的一天。
我无法将系统本地时间更改为 UTC,因为其他应用程序依赖于本地时间。我想知道是否可以仅在 UTC 00:00 执行此 cron,同时保持我的系统本地时间。
我尝试将 TZ=UTC 添加到 cron 脚本中,但没有成功。
有人知道怎么做吗?
答案1
通常,cron 守护进程会继承系统的时区。我知道的唯一 (简单) 方法是设置 TZ/CRON_TZ 变量。
设置 TZ / CRON_TZ 变量后,您是否重新启动了 cron 守护程序。这是 cron 生效更改所必需的!
答案2
一些实现识别 CRON_TZ 变量来指定 crontab 数字的解释。Centos man 5 crontab
7 说:
The CRON_TZ variable specifies the time zone specific for the cron table. The user should enter a time according to the specified time zone into the table. The time used for writing into a log file is taken from the local time zone, where the daemon is running.
而默认的 Debian/Ubuntu 则说:
The cron daemon runs with a defined timezone. It currently does not support per-user timezones. All the tasks: system's and user's will be run based on the configured timezone. Even if a user specifies the TZ environment variable in his crontab this will affect only the commands executed in the crontab, not the execution of the crontab tasks themselves.
因此,如果你的系统尊重它:
CRON_TZ=UTC
SHELL=/bin/sh PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
0 0 * * * root /usr/local/sbin/app_logrotate >> /var/log/app-newday.log