定时任务cron时区的问题

in #cn6 years ago

在昨天的帖子Banana Pi M3调整时区,我写到为了保持和我的服务器和VPS上时区一致,我把香蕉派M3的时区改成了UTC。


(图源 :pixabay)

可是今天发现问题来了,我明明设置的是北京时间零时执行的程序,可是为何北京时间下午四点就被执行了呢?

检查

查看了一下系统时间/时区:

date

时区没有问题

Sat Apr 13 12:07:43 UTC 2019

再查看一下我的cron设置

crontab -l

貌似时间时间设置的并无问题(北京时区为东八区UTC+8)

0 16 * * * ~/xxx.sh

分析

既然我的设置都没问题,那肯定是其它什么地方出问题了,而且很明显是时区问题。根据我程序的执行时间很容易判断cron还在按旧的时区来处理定时任务

大家都知道定时任务是有cron守护进程来完成的,crontab是用来设置cron的工具。那么如果cron守护进程启动时系统是一个时区A,而中途更改成时区B,如果cron不监控时区变化,倒是完全符合我遇到的情况。

那么cron中是如何读入时区信息的呢?我在/etc/init.d/cron中发现这段代码:

Reveal spoiler

上述代码大意是当变量TZ不存在,且存在文件/etc/timezone,则从文件中读入内容赋值给TZ。而/etc/timezone中保存的就是时区信息,我们可以用如下指令查看:

cat /etc/timezone

其中内容为:

Reveal spoiler

解决

知道了原因,解决起来就简单多了,想必只需重启一下cron,就应该可以读入修改后的时区信息了。

sudo /etc/init.d/cron restart

提示信息如下:

Reveal spoiler

我确认了一下,cron这次确实按我计划的时间(北京时间零时)执行了程序,说明重启还是可以解决问题的。

补充

然而仔细观察了一下,发现sudo /etc/init.d/cron restart并没有执行到读取时区信息的代码,在执行下列指令后,程序就被接管了

. /lib/lsb/init-functions

至于怎么接管的,我还没有研究明白,看来我的知识也已经过期了,不过懒得深究了,反正问题解决了😀

需要记住的就是,更新系统时区后记得重启cron守护进程

相关链接


Vote For Me As Witness
https://steemit.com/~witnesses type in oflyhigh and click VOTE

Vote @oflyhigh via Steemconnect
Thank you!

Sort:  

Thank you so much for participating in the Partiko Delegation Plan Round 1! We really appreciate your support! As part of the delegation benefits, we just gave you a 3.00% upvote! Together, let’s change the world!