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.