Hora de início do processo com fuso horário

2

Estou tentando identificar se um arquivo é criado depois de iniciar o processo ou não. Estou recebendo a hora de início do processo usando o comando ps -f -p PID -o lstart= . Isso me dá um resultado como Fri May 5 09:15:35 2017 que não tem informações de fuso horário.

Por outro lado, o sistema de arquivos me fornece datas com fuso horário. Quando comparo datas, recebo o resultado errado. Exemplo:

  • início do processo: 2017-05-05 10:26:57 +0000 UTC
  • arquivo modificado: 2017-05-05 10:26:57.679508679 +0200 CEST

É possível obter a hora de início do processo com um formato diferente, por exemplo, como data do unix? (Ter milissegundos ajudaria também)

Contexto: estou executando o comando ps de um aplicativo go e analisando o resultado.

    
por rosencreuz 05.05.2017 / 11:13

1 resposta

4

O sistema de arquivos não oferece tempo com fuso horário, é o comando usado para exibir esse horário em um formato amigável que pode fornecer um fuso horário se ele desejar exibir a hora na hora local (conforme especificado). por /etc/localtime , $TZ ou outro).

Geralmente, os timestamps no Unix são expressos de forma irrelevante para fusos horários. O tempo unix epoch é o número de segundos (segundos expressos como a parte 86400 de um dia, portanto, variando em tamanho, mas mais útil para o cálculo do calendário) desde um evento preciso no histórico (1970-01-01 00:00:00 UTC, um tempo inequívoco). Fusos horários só entram em cena quando exibem uma data em um formato de calendário para um ser humano.

ps -o lstart= -p "$pid"
date -r /some/file

ambos fornecem a hora local. date pode gerar o deslocamento do fuso horário ou não, dependendo da localidade. Se você quiser o horário UTC, execute-os em TZ=UTC0 :

TZ=UTC0 ps -o lstart= -p "$pid"
TZ-UTC0 date -r /some/file # or use date -u

O GNU date é capaz de analisar a data relatada por ps , para que você possa convertê-la em qualquer formato, como a hora da época do unix:

(export TZ=UTC0
date -d "$(ps -o lstart -p "$pid") +%s
date -r /some/file +%s)

(acima usando a hora UTC. Também funcionaria com qualquer hora local em seu ambiente, exceto por uma hora no ano em que uma saída de tempo sem indicação TZ é ambígua (em zonas que implementam DST)).

Em qualquer caso, a hora de início de um processo não precisa ser (e nunca é exatamente) a hora em que o processo executou o comando que está sendo executado no momento. Por exemplo:

$ TZ=UTC0 strace -qtt -e execve sh -c 'sleep 3; exec env ps -o lstart= -p "$$"'
10:27:24.877397 execve("/bin/sh", ["sh", "-c", "sleep 3; exec env ps -o lstart= "...], [/* 28 vars */]) = 0
10:27:27.882553 execve("/usr/bin/env", ["env", "ps", "-o", "lstart=", "-p", "9397"], [/* 28 vars */]) = 0
10:27:27.885272 execve("/bin/ps", ["ps", "-o", "lstart=", "-p", "9397"], [/* 28 vars */]) = 0
Fri May  5 10:27:24 2017

Esse processo 9397 está executando 4 comandos em seu tempo de vida: strace (bifurcada), sh , env , ps . A hora reportada por ps corresponde à hora em que foi bifurcada por strace , não quando executou ps .

Se você deseja obter uma precisão de subsegundo (até 1/$(getconf CLK_TCK) ), com zsh , pode fazer isso:

zmodload zsh/datetime
tick=$(getconf CLK_TCK)
(echo $((EPOCHREALTIME + (${${=$(</proc/self/stat)##*)}[20]}. -
          ${${=$(</proc/$pid/stat)##*)}[20]})/tick)))

Ou seja, obtemos o horário de início do $ pid e de um subshell recém-criado (que são os 20º campos após a última ocorrência de um caractere ) em /proc/pid/stat expresso em CLK_TCK nas versões modernas do Linux). a diferença em CLK_TCK e adicione à hora atual.

    
por 05.05.2017 / 12:21