我需要为 java 应用程序伪造时间(这就是 --exclude-monotonic 的原因),我需要指定确切的时间戳,但我需要时钟来滴答作响,而不是被冻结。对于 IIUC 的这种行为,我必须使用以下演示命令说:
faketime --exclude-monotonic -f "@2030-11-02 12:47:00" bash -c 'watch -n 0.5 date';
省略--exclude-monotonic
并没有什么不同。观察到的行为是watch
右上角的命令在 2030 年滴答作响(太棒了!),但产生的日期date
没有滴答作响,并且卡在开始时间。我在 java 应用程序中有相同的卡住行为,但提供的示例更好地演示了这个问题。
这是为什么?
如果您使用您尝试过的命令,则时钟开始时间将应用于环境中执行的每个命令
faketime
。实际上,该@
符号声明所有子进程都应该从这个绝对时间开始。使用高级格式化时,没有简单的方法可以为所有子流程声明一个共享且自洽的起点:这里, 的时间
watch
与 报告的时间不一致date
。查看源代码,我注意到仅当“高级时间戳规范格式”处于活动状态时才应用此行为(即您使用过
-f
):该
+
符号声明了一个相对偏移量,但要确定相对偏移量,您必须执行日期数学并从目标开始日期减去当前日期/时间:可怕。
幸运的是,您的特定时间戳格式可以正确解析而无需高级格式,这将提供您想要的行为: