Làm thế nào để tìm thời gian hoạt động của một quá trình linux


69

Làm thế nào để tôi tìm thấy thời gian hoạt động của một quy trình linux nhất định.

ps aux | grep gedit | grep -v grep

cung cấp cho tôi rất nhiều thông tin bao gồm thời gian bắt đầu quá trình. Tôi đặc biệt tìm kiếm công tắc trả về thời gian hoạt động của một quá trình tính bằng mili giây.

Cảm ơn

Câu trả lời:


113

Vì "thời gian hoạt động" có một số ý nghĩa, đây là một lệnh hữu ích.

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

Lệnh này liệt kê tất cả các quy trình với một số cột liên quan đến thời gian khác nhau. Nó có các cột sau:

PID COMMAND                          STARTED     ELAPSED     TIME COMMAND

PID= ID tiến trình
đầu tiên COMMAND= chỉ tên lệnh không có tùy chọn và không có đối số
STARTED= thời gian tuyệt đối quá trình được bắt đầu
ELAPSED= thời gian trôi qua kể từ khi quá trình được bắt đầu ( thời gian đồng hồ treo tường ), định dạng [[dd-] hh:] mm: ss TIME= tích lũy Thời gian của CPU, định dạng "[dd-] hh: mm: ss"
second COMMAND= lại lệnh, lần này với tất cả các tùy chọn và đối số được cung cấp


1
Đẹp. Tôi thích etimesbản thân mình hơn - thời gian trôi qua trong vài giây - vì vậy máy có thể đọc được
Asfand Qazi

1
câu hỏi là về thời gian thống kê tính bằng mili giây
yohann.martineau

Thật không may, busybox 1.29.3 đã phá vỡ định dạng cho etime, vì vậy đừng dựa vào nó để phân tích cú pháp.
Danny Dulai

10

Nếu bạn có một phiên bản giới pshạn như được tìm thấy trong busybox, bạn có thể lấy thời gian bắt đầu quá trình bằng cách xem dấu thời gian của /proc/<PID>. Ví dụ: nếu pid bạn muốn xem là 55 ...

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

... và sau đó so sánh nó với ngày hiện tại ...

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

Điều này dường như không còn hoạt động trên các hạt nhân hiện tại.
goertzenator

7

Tôi nghĩ bạn chỉ có thể chạy:

$ stat /proc/1234

1234 là id quá trình.

ví dụ với hai quá trình bắt đầu ở cùng một phút giây nhưng không phải là một phần nghìn giây:

$ 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

Một điều đơn giản như vậy không được trả lời đúng sau 5 năm?

Tôi không nghĩ rằng bạn có thể nhận được chính xác mili giây. ví dụ. nếu bạn thấy man procfsvà xem trường /proc/$$/statnào có trường 22 là thời gian bắt đầu, trong "tích tắc đồng hồ", bạn sẽ có một cái gì đó chính xác hơn, nhưng đồng hồ tích tắc không đi với tốc độ hoàn toàn ổn định (liên quan đến 'thời gian đồng hồ treo tường') và sẽ được nghỉ ... ngủ và những thứ nhất định (ntpd tôi đoán) bù đắp cho nó. Ví dụ: trên máy chạy ntpd, với 8 ngày hoạt động và chưa bao giờ ngủ, dmesg -Tcó cùng một vấn đề (tôi nghĩ ...), và bạn có thể thấy điều đó ở đây:

# 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

Đây là giây:

# 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"

3

vâng, quá cũ và quá khó thứ. Tôi đã thử với phương pháp "stat" được đề xuất ở trên nhưng điều gì sẽ xảy ra nếu tôi đã "chạm" vào thư mục PID Proc ngày hôm qua? Điều này có nghĩa là quá trình năm tuổi của tôi được hiển thị với dấu thời gian của ngày hôm qua. Không, không phải thứ tôi cần :(

Trong những cái mới hơn, nó đơn giản:

ps -o etimes -p <PID>
ELAPSED
339521

đơn giản vậy thôi. Thời gian có mặt trong vài giây. Làm bất cứ điều gì bạn cần nó cho. Với một số hộp cũ hơn, tình hình khó khăn hơn, vì không có etimes. Người ta có thể dựa vào:

ps -o etime -p <PID>
ELAPSED
76-03:26:15

trông có vẻ hơi "lạ" vì nó ở định dạng dd-hh: mm: ss. Không phù hợp để tính toán thêm. Tôi sẽ thích nó trong vài giây, do đó tôi đã sử dụng cái này:

ps -o etime -p <PID> --no-headers | awk -F '(:)|(-)' 'BEGIN{a[4]=1;a[3]=60;a[2]=3600;a[1]=86400;s=0};{for (i=NF;i>=1;i--) s=s+a[i]*$i}END{print s}'
339544

Đây là một cách thực sự hay trên các hệ thống cũ, cảm ơn :)
RobotJohnny

không phân tích đầu ra của etime vì busybox 1.29.3 đã thay đổi định dạng. thay vào đó, hãy sử dụng phương pháp stat + / Proc
Danny Dulai

-1
[root@ip-x-x-x-x ec2-user]# ps -p `pidof java` -o etimes=
 266433

pidof java => process id cho quá trình java

etimes= => thời gian tính bằng giây và '=' là xóa tiêu đề

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.