java - RHEL 5/RHEL 6 上的 libfaketime 和 java

标签 java linux time rhel

为了测试日期/时间设置为过去或 future 的 java 代码,我想尝试 libfaketime(目前我们只是调整系统时钟,但它会导致很多麻烦,例如无法正常工作的 kerberos 等)。

我尝试使用这个小测试程序:

$ cat time.java
import java.util.*;

class TimeTest {

    public static void main(String[] s) {

        long timeInMillis = System.currentTimeMillis();
        Calendar cal = Calendar.getInstance();
        cal.setTimeInMillis(timeInMillis);
        java.util.Date date = cal.getTime();

        System.out.println("Date: " + date);
    }
}

然后执行这个:

LD_ASSUME_KERNEL=2.6.18 LD_PRELOAD=/usr/lib64/libfaketime.so.1 FAKETIME="-15d" /opt/IBM/WebSphere/AppServer/java_1.7_64/bin/java TimeTest
Invalid clock_id for clock_gettime: -172402[root@myhost ~]#

但是如您所见,我只收到一条错误消息。 测试在 RHEL 6.5 服务器上执行,内核 2.6.32-431 和 libfaketime 0.9.6

您对我如何解决这个问题有什么建议吗?我也有兴趣了解您在 RHEL 上使用 libfaketime 和 java 的经验。

我还报告了这个问题:https://github.com/wolfcw/libfaketime/issues

最好的问候,

二灵

最佳答案

我在 IBM JVM 1.7.0 中也观察到这种不正确的行为,而在 Oracle JVM 1.6.0 中这按预期工作。 解释是 IBM JVM 显然有一个内部错误,它通过调用 clock_gettime 表现出来。使用不正确的 clock_id 参数(随机负值)的系统调用。 解决方法(不是修复)是修改 libfaketime.c在 fake_clock_gettime 函数中将 clock_id 重置为有效值。

case FT_START_AT: /* User-specified offset */
  if (user_per_tick_inc_set)
  {
    /* increment time with every time() call*/
    next_time(tp, &user_per_tick_inc);
  }
  else
  { 
    if (clk_id < 0) { // jvm calls clock_gettime() with invalid random negative clock_id value
        clk_id = CLOCK_REALTIME;
    }

    switch (clk_id)
    // the rest is the same

这将防止 libfaketime.so.1 库因您观察到的错误而存在

 printf("\nInvalid clock_id for clock_gettime: %d", clk_id);
 exit(EXIT_FAILURE);

请注意,此变通办法有一个缺点,即如果 JVM 错误地向系统询问无效的 clockid,我们将假设有效的 clockid,这可能不是应用程序所期望的。

关于java - RHEL 5/RHEL 6 上的 libfaketime 和 java,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26602617/

相关文章:

python - 是否可以在每个 STDERR 前面加上给定的字符串

javascript - Date.UTC() 获取值 null

java - 获取高达 100 纳秒的基于时间的 uuid

java - 特定序列的递归方法

php - cron 会执行 php 文件还是只执行 CGI 脚本?

python - 在 glob 中扩展星号

python - 在实践中,为什么比较整数比比较字符串更好?

java - 如何设置组件的DataFlavor?

java - 方法中final变量声明的作用是什么?

java - Spring启动自动配置