如何查找 Linux 進程的正常運作時間

如何查找 Linux 進程的正常運作時間

如何找到給定 Linux 進程的正常運行時間。

ps aux | grep gedit | grep -v grep

為我提供了大量信息,其中包括該過程開始的時間。我專門尋找能夠以毫秒為單位返回進程正常運行時間的開關。

謝謝

答案1

由於“正常運行時間”有多種含義,因此這裡有一個有用的命令。

ps -eo pid,comm,lstart,etime,time,args

此命令列出了具有多個不同的時間相關列的所有進程。它有以下列:

PID COMMAND                          STARTED     ELAPSED     TIME COMMAND

PID
=首先是進程 ID COMMAND= 僅不帶選項和參數的命令名稱
STARTED= 進程啟動的絕對時間
ELAPSED= 自進程啟動以來經過的時間 (掛鐘時間),格式 [[dd-]hh:]mm:ss TIME= 累積 CPU 時間,「[dd-]hh:mm:ss」 格式
第二個COMMAND= 再次執行該指令,這次包含所有提供的選項和參數

答案2

如果您有 的有限版本,ps例如 中找到的busybox,您可以透過查看 的時間戳來取得進程開始時間/proc/<PID>。例如,如果您要查看的 pid 是 55...

# ls -al /proc | grep 55
dr-xr-xr-x    7 root     root             0 May 21 05:53 55

...然後將其與當前日期進行比較...

# date
Thu May 22 03:00:47 EDT 2014

答案3

我認為你可以運行:

$ stat /proc/1234

1234 是進程 ID。

兩個進程在同一時分秒但不同毫秒啟動的範例:

$ stat /proc/9355
...
Access: 2017-11-13 17:46:39.778791165 +0100
Modify: 2017-11-13 17:46:39.778791165 +0100
Change: 2017-11-13 17:46:39.778791165 +0100
$ stat /proc/9209
...
Access: 2017-11-13 17:46:39.621790420 +0100
Modify: 2017-11-13 17:46:39.621790420 +0100
Change: 2017-11-13 17:46:39.621790420 +0100

答案4

這麼簡單的事情5年後還沒有妥善解答嗎?

我認為你不能準確地得到毫秒。例如。如果您看到man procfs並看到/proc/$$/stat哪個欄位22 作為起始時間(位於「時鐘滴答」中),您會得到更精確的結果,但時鐘滴答不會以完全恆定的速率(相對於「掛鐘時間」)進行,並且會休息……睡覺和某些事情(我猜是 ntpd)抵消了它。例如,在一台運行 ntpd 的機器上,正常運行時間為 8 天並且從未睡眠過,也dmesg -T有同樣的問題(我認為...),您可以在這裡看到它:

# date; echo h > /proc/sysrq-trigger; dmesg -T | tail -n1 ; date
Fri Mar  3 10:26:17 CET 2017
[Fri Mar  3 10:26:16 2017] sysrq: SysRq : HELP : loglevel(0-9) reboot(b) crash(c) terminate-all-tasks(e) memory-full-oom-kill(f) kill-all-tasks(i) thaw-filesystems(j) sak(k) show-backtrace-all-active-cpus(l) show-memory-usage(m) nice-all-RT-tasks(n) poweroff(o) show-registers(p) show-all-timers(q) unraw(r) sync(s) show-task-states(t) unmount(u) force-fb(V) show-blocked-tasks(w) 
Fri Mar  3 10:26:17 CET 2017

這是秒:

# example pid here is just your shell
pid=$$

# current unix time (seconds since epoch [1970-01-01 00:00:00 UTC])
now=$(date +%s)

# process start unix time (also seconds since epoch)
# I'm fairly sure this is the right way to get the start time in a machine readable way (unlike ps)...but could be wrong
start=$(stat -c %Y /proc/"$pid")

# simple subtraction (both are in UTC, so it works)
age=$((now-start))

printf "that process has run for %s seconds\n" "$age"

相關內容