it-swarm-eu.dev

Jak zkontrolovat, jak dlouho proces běží?

Chtěl bych se tomu vyhnout spuštěním procesu z monitorovací aplikace.

250
tshepang

V systému Linux s funkcí ps from procps(-ng) (a ve většině ostatních systémů, protože je to určeno POSIX):

ps -o etime= -p "$$" 

Kde $$ Je PID procesu, který chcete zkontrolovat. Tím se vrátí uplynutý čas ve formátu [[dd-]hh:]mm:ss.

Pomocí -o etime Řekne ps, že chcete pouze uplynulé časové pole a = Na konci potlačí záhlaví (bez, dostanete řádek, který říká ELAPSED a pak čas na dalším řádku; s, dostanete jen jeden řádek s časem).

Nebo s novějšími verzemi sady nástrojů procps-ng (3.3.0 nebo vyšší) v systému Linux nebo na FreeBSD 9.0 nebo novějším (a možná i dalšími), použijte:

ps -o etimes= -p "$$"

(s přidaným s), aby byl čas formátován jako sekundy, což je užitečnější ve skriptech.

V Linuxu to program ps získává od /proc/$$/stat, Kde jedním z polí (viz man proc) Je čas zahájení procesu. Toto je bohužel specifikováno jako čas v jiffies (libovolný čítač času používaný v jádru Linuxu) od zavedení systému. Takže musíte určit čas, ve kterém systém zavedl (z /proc/stat), Počet jiffů za sekundu v tomto systému, a pak udělat matematiku, abyste získali uplynulý čas v užitečném formátu.

Nalezení hodnoty HZ (tj. Jiffů za sekundu) je směšně komplikované. Z komentářů v sysinfo.c V balíčku procps lze A) zahrnout soubor záhlaví jádra a překompilovat, pokud je použito jiné jádro, B) použít funkci posix sysconf(), která, bohužel, používá pevně zakódovanou hodnotu zkompilovanou do knihovny C nebo C) zeptejte se jádra, ale neexistuje oficiální rozhraní. Kód ps tedy zahrnuje řadu kludges, podle kterých určuje správnou hodnotu. Wow.

Je tedy výhodné, aby ps to vše udělal za vás. :)

Jak poznamenává uživatel @ 336_, v systému Linux (není přenosný) můžete pomocí příkazu stat zobrazit data přístupu, změny nebo změny stavu adresáře /proc/$$ (Kde znovu $$ Je předmětem zájmu). Všechna tři čísla by měla být stejná

stat -c%X /proc/$$

vám poskytne čas, který proces $$ začal, v sekundách od epochy. To stále ještě není úplně to, co chcete, protože stále musíte udělat matematiku, abyste odečetli, že od aktuálního času uplynulý čas - myslím, že by něco jako date +%s --date="now - $( stat -c%X /proc/$$ ) seconds" fungovalo, ale je to trochu nemilosrdně. Jednou možno výhodou je, že pokud použijete výstup v dlouhém formátu jako -c%x Namísto -c%X, Získáte větší rozlišení než celé celé číslo. Pokud to však potřebujete, měli byste pravděpodobně použít přístup auditování procesů, protože načasování spuštění příkazu stat bude rušit přesnost.

324
mattdm

Přenosný:

% ps -o stime,time $$
STIME     TIME
Jan30 00:00:06

tj. že Shell byl zahájen 30. ledna a celkem činil asi 6 sekund času CPU.

Mohou existovat přesnější nebo podrobnější, ale méně přenosné způsoby, jak získat tyto informace. Zkontrolujte dokumentaci k vašemu příkazu ps nebo k vašemu souborovému systému proc.

V systému Linux tato informace žije v /proc/$pid/stat .

awk '{print "CPU time: " $14+$15; print "start time: " $22}' /proc/$$/stat

CPU čas je v jiffies; Nevím, jak najít Jiffyho hodnotu od Shell. Čas zahájení je relativní k času spuštění (nalezen v /proc/uptime).

ps -eo pid,comm,cmd,start,etime | grep -i X

X je název procesu

19
mezi

ps trvá -o možnost specifikovat výstupní formát a jedním z dostupných sloupců je etime. Podle manuálové stránky:

etime - uplynulý čas od zahájení procesu, ve tvaru [[dd-] hh:] mm: ss.

Můžete tak spustit, abyste získali PID a uplynulý čas každého procesu:

$ ps -eo pid,etime

Pokud chcete, aby uplynulý čas konkrétního PID (např. 12345), můžete udělat něco jako:

$ ps -eo pid,etime | awk '/^12345/ {print $2}'

( Upravit : Ukázalo se, že pro výše uvedený příkaz je kratší syntaxe; viz odpověď mattdm )

13
Michael Mrozek

Nejste si jisti, proč to ještě nebylo navrženo: v systému Linux můžete pro svůj PID stat() adresář/proc/[nnn].

Toto chování je výslovně navrženo tak, aby vrátilo čas zahájení procesu, který může provádět ve vysokém rozlišení a které jádro dokáže přesně bez hacků jiffies, protože jádro může (samozřejmě) jednoduše zkontrolovat příslušné informace. Pole přístupu, modifikace dat a změny stavu vrací čas zahájení procesu.

Nejlepší ze všeho je, že ve Shell můžete použít stat(1) nebo odpovídající vazbu k stat(2) from $ oblíbené_programming_language, takže možná ani nebudete muset spustit externí proces.

POZNÁMKA že toto ne pracuje s /usr/compat/linux/proc na FreeBSD; vrácené časy přístupu/modifikace/změny stavu jsou aktuální čas a čas narození je epocha UNIX. Docela hloupá podpora tam není, pokud se mě zeptáš.

5
i336_

Pokud můžete spustit čas a provést příkaz, dostanete přesně to, co hledáte. Toto nemůžete udělat proti již spuštěnému příkazu.

[0]% času spánku 20

spánek 20 0,00 s uživatel 0,00 s systém 0% cpu 20,014 celkem

2
slashdot

$ ps -eo lstart získat čas zahájení

$ ps -eo etime získat trvání/uplynulý čas

$ ps -eo pid,lstart,etime | grep 61819
  PID                   STARTED     ELAPSED
  61819 Mon Sep 17 03:01:35 2018    07:52:15

61819 je ID procesu.

2
Terry wang

Uplynulý čas v sekundách: expr $(date +"%s") - $(stat -c%X /proc/<PID HERE>)

1
Shardj

počáteční čas procesu můžete získat tak, že se podíváte na stat souboru stat vytvořeného v proc, naformátujeme ho pomocí date a odečteme ho od aktuálního času:

echo $(( $(date +%s) - $(date -d "$(stat /proc/13494/stat | grep Modify | sed 's/Modify: //')" +%s) ))

kde 13494 je váš proces 'pid

1
bobbins