Preciso falsificar o tempo para o aplicativo java (esse é o motivo de --exclude-monotonic), preciso especificar o carimbo de data/hora exato, mas preciso que o relógio marque, não para ser congelado. Para esse comportamento IIUC, tenho que usar o seguinte comando demonstrativo:
faketime --exclude-monotonic -f "@2030-11-02 12:47:00" bash -c 'watch -n 0.5 date';
omitir --exclude-monotonic
não faz diferença. O comportamento observado é que watch
o comando no canto superior direito está marcando o ano de 2030 (ótimo!), mas a data produzida por date
não está marcando e está travada na hora de início. Eu tenho o mesmo comportamento travado no aplicativo java, mas o exemplo fornecido demonstra melhor o problema.
Por que é que?
Se você usar o comando que você tentou, a hora de início do relógio é aplicada a cada comando executado no
faketime
ambiente. De fato, o@
símbolo declara que todos os subprocessos devem começar a partir deste tempo absoluto. Ao usar a formatação avançada, não há uma maneira fácil de declarar um ponto de partida compartilhado e autoconsistente para todos os subprocessos:Aqui, a hora de
watch
está em desacordo com a hora informada pordate
.Olhando para a fonte , noto que esse comportamento é aplicado apenas quando o "formato de especificação de timestamp avançado" está ativo (ou seja, você usou
-f
):O
+
símbolo declara um deslocamento relativo, mas para determinar o deslocamento relativo, você teria que realizar cálculos de data e subtrair a data/hora atual da data de início prevista:Horrível.
Felizmente, seu formato específico de carimbo de data/hora pode ser analisado corretamente sem a necessidade de formatação avançada, e isso fornecerá o comportamento desejado: