修改本机的系统时间对send_after的影响

前几天写了一个系统, 在本机自测时,为了测试方便,修改了本机的系统时间(将时间向未来调),但是随后,出现了诡异的bug,费了一段时间后,才发现原因:

修改系统时间之前,原本是每分钟触发一次的逻辑,在修改了系统时间后,每分钟可能会触发一次,但也可能会触发两次!

通过调试打印信息,发现当某分钟内触发两次时,是有规律的,一次是在该分钟的0秒,另一次是在该分钟的59秒。

程序的逻辑很简单,就是一个gen_server的模块,在init()时, 调用schedule_loop(),预定一个下一分钟的loop消息,在收到loop消息后,调用schedule_loop()以再次预定一个下一分钟的loop消息,并做相应处理,依此循环下去。

如下是schedule_loop()的实现:

schedule_loop() ->
    {_Hour, _Min, Sec} = erlang:time(),
    Intv =  60 - Sec,
    erlang:send_after(Intv*1000, self(), loop).

如下是收到loop消息对应的处理函数:

handle_info(loop, State) ->
    schedule_loop(),
    loop_handle(),
    {noreply, State};

修改系统时间为什么会产生这种影响? erlang:send_after()的实现原理是如何的? 目前还不清楚,以后有时间再研究下底层,这里先mark一下,以后得留心!

  

  

时间: 2024-10-16 05:08:55

修改本机的系统时间对send_after的影响的相关文章

android 命令修改时间或程序修改系统时间

前提是手机必须先获取root; root方法见其他章节或网上都有介绍 adb shell  进入shell 终端界面 1.先设置系统的时区配置 cat /data/property/persist.sys.timezone //查看当前时区配置文件 setprop persist.sys.timezone GMT        //修改属性 2.开始设置修改当前系统时间 date -s "yyyymmdd.[[[hh]mm]ss]"  或System/bin/date -s "

linux修改单个应用的系统时间

简介 如下是 libfaketime 的一个简单实例. 在工作中常常需要测试修改时间,如果环境不允许调整时间,就要想办法调整单个进程的时间了. 编译安装 git clone https://github.com/wolfcw/libfaketime.git cd libfaketime && make install python 测试脚本 test.py import os import time import datetime def set_time(): while True: p

修改linux系统时间的方法(date命令)

修改linux系统时间的方法(date命令) 来源:互联网 作者:佚名 时间:11-18 23:22:27 [大 中 小] date命令不仅可以显示系统当前时间,还可以用它来修改系统时间,下面简单的介绍下,方便需要的朋友 命令格式为: date -s 时间字符串 例如只修改系统的日期,不修改时间(时分秒) date -s 2012-08-02 或只修改时间不修改日期 date -s 10:08:00 当然也可以同时修改日期和时间 date -s "2012-05-18 04:53:00"

配置NTP网络时间自动校对系统时间和创建备份文件

1 案例1:配置用户和组账号 1.1 问题 本例要求创建下列用户.组以及组的成员关系: 新建用户 alex,其用户ID为3456,密码是flectrag 创建一个名为 adminuser 的组 创建一个名为 natasha 的用户,其属于 adminuser 组,这个组是该用户的从属组 创建一个名为 harry 的用户,其属于 adminuser 组,这个组是该用户的从属组 创建一个名为 sarah 的用户,其在系统中没有可交互的 Shell,并且不是 adminuser 组的成员 natash

【原】定时器与系统时间

问题:--------------------------------------------------------------------------------用户反馈一些定时活动提前开启或者延后开启1) 登录服务器,查看时间确实慢了或者快了.总之是有几台服务器时间不准确了.2) 查看代码是使用的ScheduledExecutorService.scheduleAtFixedRate,Java的API,不至于这里存在Bug3) 查看log4j日志输出发现:    12点的定时活动,之前的[

[转载]如何使Android应用程序获取系统权限来修改系统时间

在 android 的API中有提供 SystemClock.setCurrentTimeMillis()函数来修改系统时间,可惜无论你怎么调用这个函数都是没用的,无论模拟器还是真机,在logcat中总会得到"Unable to open alarm driver: Permission denied ".这个函数需要root权限或者运行与系统进程中才可以用. 本来以为就没有办法在应用程序这一层改系统时间了,后来在网上搜了好久,知道这个目的还是可以达到的. 第一个方法简单点,不过需要在

0002_20190328_Centos修改系统时间

一.   设置修改时间: 查看当前时区: [root@localhost bin]# date -R Thu, 28 Mar 2019 11:31:19 +0800 2. 查看时间和日期: [root@localhost bin]# date 2019年 03月 28日 星期四 11:32:38 CST 3. 查看硬件时间: [root@localhost bin]# hwclock --show 4. 设置当前日期: [root@localhost bin]# date -s 2019-3-2

linux 修改服务器系统时间

前言 因项目需求需要修改统一系统时间 详情配置如下: 在CentOS 7里面有一个命令timedatectl可以帮助我们修改服务器的时区. 1. 查看服务器里的时间设置 timedatectl ,它等同于 timedatectl status : 2. 了解 timedatectl 命令的各个参数: 3. 设置时间 下面看下CentOS修改服务器系统时间 linux安装完毕后,一般都是国外的世界,一点都不方便设置任务,或者导致网站获取本地的时间错乱,所以就需要把服务器的时间改为和本地时间一致,也

查看和修改系统时间

Echo -n 不换行显示 echo -e不转义 Date '+%Y-%m-%d 查看当前时间   date-s '2017/09/04'表示修改时间 %w表示周   %H:%M:%S时分秒 +%F=+%Y-%m-%d  %T=%H:%M:%S $()=反引号 hwclock将修改后的系统时间写到bios里 Date +%F -d '-3 day'三天前 -一定要 Date +%F -d '+3 day'三天以后 +可以不要 Date +%H -d '-3 hour'3小时以前 Sed '/^$