在昨天的帖子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守护进程。
相关链接
https://steemit.com/~witnesses type in
oflyhigh
and click VOTE
Vote @oflyhigh via Steemconnect
Thank you!
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!