Khi nào một quá trình bắt đầu


31

Để biết khi nào một quá trình bắt đầu, dự đoán đầu tiên của tôi là kiểm tra thời gian /proc/<pid>/cmdlineđược viết / sửa đổi lần cuối cùng.

pscũng cho thấy một STARTlĩnh vực. Tôi nghĩ cả hai nguồn này đều giống nhau. Đôi khi chúng không giống nhau. Làm thế nào mà có thể được?


Câu trả lời:


44

Trên Linux ít nhất, bạn cũng có thể làm:

ps -o lstart= -p the-pid

để có một thời gian bắt đầu hữu ích hơn.

Tuy nhiên, xin lưu ý rằng đó là thời gian quy trình được bắt đầu, không nhất thiết là thời gian mà lệnh hiện đang thực thi được gọi. Các quy trình có thể (và thường làm) chạy nhiều hơn một lệnh trong đời. Và các lệnh đôi khi sinh ra các quá trình khác.

Các mtimes của các tệp trong /procLinux (ít nhất) nói chung là ngày mà các tệp đó được khởi tạo, đây sẽ là lần đầu tiên một cái gì đó cố gắng truy cập chúng hoặc liệt kê nội dung thư mục.

Ví dụ:

$ sh -c 'date +%T.%N; sleep 3; echo /proc/"$$"/xx*; sleep 3; stat -c %y "/proc/$$/cmdline"'
13:39:14.791809617
/proc/31407/xx*
2013-01-22 13:39:17.790278538 +0000

Việc mở rộng /proc/$$/xx*khiến trình bao đọc nội dung /proc/$$khiến cmdlinetệp được khởi tạo.

Xem thêm: Dấu thời gian của ổ cắm trong / Proc // fd


11

Proc là một hệ thống tệp ảo vì vậy tôi sẽ không dựa vào bất kỳ thông tin trạng thái tệp nào.

Thời gian bắt đầu của quá trình được đặt tại / Proc / PID / cột cột 22 . Nó được đưa ra trong jiffies sau khi khởi động hệ thống. Để chuyển đổi nó thành giây, bạn phải chia nó sysconf(_SC_CLK_TCK)cho 100 cho hầu hết các hệ thống (nhưng không phải tất cả!).

Để có được thời gian khởi động hệ thống, bạn xác định thời gian hoạt động hiện tại tính bằng giây, đó là giá trị đầu tiên của / Proc / thời gian hoạt động .

Có hai số đó bạn trừ số thứ nhất từ ​​số thứ hai và bạn nhận được số giây trôi qua kể từ khi bắt đầu chương trình.

Ví dụ (đối với pidgin ):

PID=$(pidof pidgin)
STARTTIME=$(awk '{print int($22 / 100)}' /proc/$PID/stat)
UPTIME=$(awk '{print int($1)}' /proc/uptime)
NOW=$(date +%s)
DIFF=$((NOW - (UPTIME - STARTTIME)))
date -d @$DIFF

Lưu ý: ví dụ đơn giản này không hoạt động nếu pidoftrả về nhiều bộ lọc.


Bất cứ ý tưởng nào về việc khi nào Proc / <pid> / cmdline được viết thành? cũng bất kỳ mục nào của Proc / <pid> cho vấn đề đó.
Swair

2
Thông thường các tệp đó được tạo bởi kernel một cách linh hoạt bất cứ khi nào bạn cố đọc chúng và hầu hết chúng cũng có nội dung động. cmdline không nhưng tôi không thể tưởng tượng rằng có một chính sách chính thức phải được tạo một lần khi khởi động quá trình và không bao giờ được chạm lại.
scai

Bạn có thể nhận giá trị _SC_CLK_TCK từ dòng lệnh bằng cách thực hiện "getconf CLK_TCK"
oᴉɹǝɥɔ
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.