Làm thế nào để có được thời gian bắt đầu của một quy trình Linux chạy dài? [đóng cửa]


250

Có thể có được thời gian bắt đầu của một quá trình chạy cũ? Có vẻ như pssẽ báo cáo ngày (không phải thời gian) nếu nó không được bắt đầu hôm nay và chỉ năm nếu nó không bắt đầu trong năm nay. Là độ chính xác bị mất mãi mãi cho các quy trình cũ?


16
Có điều gì sai với việc sử dụng ps -p <pid> -o lstart? Có vẻ như nó hoạt động, nhưng tôi không chắc tại sao nó không phải là câu trả lời rõ ràng ngay lập tức cho nhiều lần câu hỏi này dường như xuất hiện.
ajwood

7
@ajwood Sẽ tốt hơn nếu sử dụng ps -p <pid> -o lstart=để tránh dòng bổ sung (tiêu đề) được in.
Vladimir Protasov

2
Có điều gì sai với việc sử dụng ps -p <pid> -o lstart? Có lẽ thực tế không có lstartkhông phải trong năm 2004 phiên bản cũng không phải trong phiên bản 2013 của POSIX tiêu chuẩn 1003.1?
Piotr Dobrogost

5
@PiotrDobrogost, đó sẽ là một vấn đề nếu câu hỏi hỏi về POSIX, nhưng đó là hỏi về Linux.
womble

4
Mods - techraf, Makyen, David Rawson, Tsyvarev, Paul Roub - tại sao bạn không chuyển nó đến một trang web phù hợp hơn như StackExchange hoặc Superuser thay vì đóng câu hỏi? Đây là một câu hỏi hay và hữu ích
Hanxue

Câu trả lời:


392

Bạn có thể chỉ định một trình định dạng và sử dụng lstart, như lệnh này:

ps -eo pid,lstart,cmd

Lệnh trên sẽ xuất ra tất cả các quy trình, với các trình định dạng để có được PID, chạy lệnh và ngày + thời gian bắt đầu.

Ví dụ (từ dòng lệnh Debian / Jessie)

$ ps -eo pid,lstart,cmd
  PID CMD                                          STARTED
    1 Tue Jun  7 01:29:38 2016 /sbin/init                  
    2 Tue Jun  7 01:29:38 2016 [kthreadd]                  
    3 Tue Jun  7 01:29:38 2016 [ksoftirqd/0]               
    5 Tue Jun  7 01:29:38 2016 [kworker/0:0H]              
    7 Tue Jun  7 01:29:38 2016 [rcu_sched]                 
    8 Tue Jun  7 01:29:38 2016 [rcu_bh]                    
    9 Tue Jun  7 01:29:38 2016 [migration/0]               
   10 Tue Jun  7 01:29:38 2016 [kdevtmpfs]                 
   11 Tue Jun  7 01:29:38 2016 [netns]                     
  277 Tue Jun  7 01:29:38 2016 [writeback]                 
  279 Tue Jun  7 01:29:38 2016 [crypto]                    
      ...

Bạn có thể đọc pstrang của bạn hoặc kiểm tra trang của Opengroup để biết các trình định dạng khác.


3
@ bohrne01: thay đổi thứ tự, ví dụ: pid, etime, cmd hoạt động với tôi trên Debian Wheezy.
ngoại lệ

1
@Gobliins - etimelà thời gian trôi qua kể từ khi quá trình được bắt đầu.
wkl

4
để hoàn thiện, đối với những người đã sử dụng cú pháp BSD: ps axo pid,cmd,lstartcũng hoạt động
Graeme Moss

2
@ bobbyme01: sử dụng tùy chọn -ww
Ed Randall

1
Xin lưu ý rằng lstartthời gian có thể thay đổi, các statphương pháp dưới đây an toàn hơn - unix.stackexchange.com/questions/274610/ .
slm

43

Lệnh ps (ít nhất là phiên bản Procps được sử dụng bởi nhiều bản phân phối Linux) có một số trường định dạng liên quan đến thời gian bắt đầu quá trình, bao gồm cả lstartluôn cung cấp đầy đủ ngày và thời gian quy trình bắt đầu:

# ps -p 1 -wo pid,lstart,cmd
  PID                  STARTED CMD
    1 Mon Dec 23 00:31:43 2013 /sbin/init

# ps -p 1 -p $$ -wo user,pid,%cpu,%mem,vsz,rss,tty,stat,lstart,cmd
USER       PID %CPU %MEM    VSZ   RSS TT       STAT                  STARTED CMD
root         1  0.0  0.1   2800  1152 ?        Ss   Mon Dec 23 00:31:44 2013 /sbin/init
root      5151  0.3  0.1   4732  1980 pts/2    S    Sat Mar  8 16:50:47 2014 bash

Để thảo luận về cách thông tin được xuất bản trong hệ thống tập tin / Proc, hãy xem /unix/7870/how-to-check-how-long-a- process-has-been-rucky

(Theo kinh nghiệm của tôi trong Linux, dấu thời gian trên thư mục / Proc / dường như có liên quan đến thời điểm thư mục ảo được truy cập gần đây thay vì thời gian bắt đầu của các quy trình:

# date; ls -ld /proc/1 /proc/$$ 
Sat Mar  8 17:14:21 EST 2014
dr-xr-xr-x 7 root root 0 2014-03-08 16:50 /proc/1
dr-xr-xr-x 7 root root 0 2014-03-08 16:51 /proc/5151

Lưu ý rằng trong trường hợp này, tôi đã chạy lệnh "ps -p 1" vào khoảng 16:50, sau đó sinh ra một vỏ bash mới, sau đó chạy lệnh "ps -p 1 -p $$" trong lớp vỏ đó ngay sau đó ... .)


Để xem mọi quy trình (không chỉ của riêng bạn), hãy thêm một đối số e( pscú pháp chuẩn ) hoặc ax(cú pháp BSD) vào lệnh ps: tức là ps -ewo pid,lstart,cmdhoặcps -axwo pid,lstart,cmd
Ryan Griffith

15

Để theo dõi câu trả lời của Adam Matan , /proc/<pid>dấu thời gian của thư mục không nhất thiết phải trực tiếp hữu ích, nhưng bạn có thể sử dụng

awk -v RS=')' 'END{print $20}' /proc/12345/stat

để có được thời gian bắt đầu trong tích tắc đồng hồ kể từ khi hệ thống khởi động. 1

Đây là một đơn vị hơi khó sử dụng; xem thêm chuyển đổi jiffies sang giây để biết chi tiết.

awk -v ticks="$(getconf CLK_TCK)" 'NR==1 { now=$1; next }
    END { printf "%9.0f\n", now - ($20/ticks) }' /proc/uptime RS=')' /proc/12345/stat

Điều này sẽ cung cấp cho bạn giây, mà bạn có thể vượt qua strftime()để có được dấu thời gian (có thể đọc được bằng con người hoặc nếu không).

awk -v ticks="$(getconf CLK_TCK)" 'NR==1 { now=$1; next }
    END { print strftime("%c", systime() - (now-($20/ticks))) }' /proc/uptime RS=')' /proc/12345/stat

Cập nhật với một số bản sửa lỗi từ Stephane Chazelas trong các bình luận; cảm ơn như mọi khi!

Nếu bạn chỉ có Mawk, có thể thử

awk -v ticks="$(getconf CLK_TCK)" -v epoch="$(date +%s)" '
  NR==1 { now=$1; next }
  END { printf "%9.0f\n", epoch - (now-($20/ticks)) }' /proc/uptime RS=')' /proc/12345/stat |
xargs -i date -d @{}

1 người đàn ông ; tìm kiếm StartTime .


Hơi được tái cấu trúc để sử dụng sản xuất: gist.github.com/tripleee/2a1622fdf8ab080ce3b36d95af60010a
tripleee 17/8/2016

1
Hãy nhớ rằng strftime()systime()không có trong mawkđó, mặc định awktrong các hình ảnh VPS 8 của Debian của tôi, vì vậy tôi chỉ có thể giả sử rằng chúng đặc trưng cho gawkphương ngữ.
ssokolow

13
ls -ltrh /proc | grep YOUR-PID-HERE

Ví dụ: PID của Google Chrome của tôi là 11583:

ls -l /proc | grep 11583
dr-xr-xr-x  7 adam       adam                     0 2011-04-20 16:34 11583

6
Điều này không hiệu quả với tôi - nó in thời gian sửa đổi (thay đổi thường xuyên) Có thể vì điều này: unix.stackexchange.com/questions/20460/ Kẻ
user920391

Dấu thời gian của / Proc / <pid> không đáng tin cậy.
Henning

1
Điều này trở lại một thời gian muộn hơn 9 phút so với khi một quá trình tôi có thông tin thực sự đã bắt đầu.
Dan Dascalescu

1
Đây dường như là lựa chọn duy nhất của tôi hoạt động, mặc dù có thể không đáng tin cậy. Tôi đang sử dụng một hệ thống nhúng chỉ có busybox pscho biết invalid optiontất cả các tùy chọn được đề cập bởi các câu trả lời khác.
Quạt Qi

7
Tại sao grep? Tại sao không ls -ldh /proc/$pid? Hoặc thậm chí tốt hơn , date -r /proc/$pid?
Caesar


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.