GNU/Linux >> Znalost Linux >  >> Linux

Čas zahájení procesu s časovým pásmem?

Snažím se zjistit, zda je soubor vytvořen po spuštění procesu nebo ne. Získávám čas zahájení procesu pomocí příkazu ps -f -p PID -o lstart= . To mi dává výsledek jako Fri May 5 09:15:35 2017 který nemá žádné informace o časovém pásmu.

Na druhou stranu mi systém souborů dává data s časovým pásmem. Když porovnám data, dostanu špatný výsledek. Příklad:

  • začátek procesu:2017-05-05 10:26:57 +0000 UTC
  • soubor upraven:2017-05-05 10:26:57.679508679 +0200 CEST

Je možné získat čas zahájení procesu v jiném formátu, například jako unixové datum? (Mít milisekundy by také pomohlo)

Kontext:Používám ps příkaz z aplikace go a analýzu výsledku.

Přijatá odpověď:

Systém souborů vám nedává čas s časovou zónou, je to jakýkoli příkaz, který použijete k zobrazení tohoto času ve formátu vhodném pro lidi, který vám může poskytnout časové pásmo, pokud se rozhodne zobrazovat čas v místním čase (jak je specifikováno /etc/localtime , $TZ nebo jiné).

Obecně platí, že časová razítka na Unixu jsou vyjádřena způsobem, který je pro časová pásma irelevantní. Unixový čas epochy je počet sekund (sekundy vyjádřené jako 86400. část dne, takže se liší svou délkou, ale je užitečnější pro výpočet kalendáře) od přesné události v historii (1970-01-01 00:00:00 UTC, jednoznačný čas). Časová pásma vstoupí do obrazu pouze při zobrazení data ve formátu kalendáře pro člověka.

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

oba vám poskytnou místní čas. date může vypsat posun časového pásma nebo ne v závislosti na národním prostředí. Pokud chcete čas UTC, spusťte je pod TZ=UTC0 :

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

GNU date je schopen analyzovat datum hlášené ps , takže jej můžete převést do libovolného formátu, jako je doba unixové epochy:

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

(výše pomocí času UTC. Fungovalo by to také s jakýmkoli místním časem ve vašem prostředí kromě jedné hodiny v roce, kdy je výstup času bez indikace TZ nejednoznačný (v zónách, které implementují letní čas)).

V každém případě čas zahájení procesu nemusí být (a nikdy není přesně) časem, kdy proces provedl příkaz, který právě běží. Například:

$ 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

Tento proces 9397 během své životnosti spouští 4 příkazy:strace (zde rozvětvený), sh , env , ps . Čas hlášený ps odpovídá době, kdy byl rozvětven pomocí strace , nikoli při spuštění ps .

Pokud chcete získat subsekundovou přesnost (až 1/$(getconf CLK_TCK) ), pomocí zsh , můžete udělat:

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

To znamená, že získáme počáteční čas $pid a nově vytvořeného subshell (to je 20. pole po posledním výskytu ) znak v /proc/pid/stat vyjádřeno v CLK_TCK v moderních verzích Linuxu), vydělte rozdíl CLK_TCK a přidat k aktuálnímu času.

Související:Proč nemohu uniknout mezerám ve skriptu bash?
Linux
  1. Začít proces na jiném Tty?

  2. Proč Unixový čas začíná na 1970-01-01?

  3. Spusťte proces s výstupem v reálném čase v PHP

  1. Spravujte NTP pomocí Chrony

  2. Jak seřadit výstup ps podle času zahájení procesu?

  3. Jak nakonfiguruji monit, aby spustil proces s konkrétním uživatelem?

  1. Jak nastavit nebo změnit časové pásmo v Linuxu

  2. Nastavte nebo změňte časové pásmo pomocí příkazu set-timezone

  3. Definování proměnné s exportem nebo bez exportu