In pids và tên của các quy trình khi chúng được tạo


10

Từ câu hỏi ở đây , OP muốn liên tục thăm dò ý kiến ​​của một quá trình sử dụng pidoftrong tập lệnh shell. Tất nhiên điều này không hiệu quả vì một quy trình mới phải được bắt đầu cho pidofchương trình nhiều lần trong một giây (tôi không biết rằng đây là nguyên nhân khiến CPU tăng đột biến trong câu hỏi, nhưng có vẻ như vậy).

Thông thường cách xoay quanh loại điều này trong tập lệnh shell là làm việc với một chương trình duy nhất xuất dữ liệu bạn cần stdoutvà sau đó thực hiện một số xử lý văn bản nếu cần. Mặc dù điều này liên quan đến nhiều chương trình được chạy đồng thời, nhưng nó có thể sẽ ít tốn CPU hơn vì các quy trình mới không được tạo ra liên tục cho mục đích bỏ phiếu.

Vì vậy, đối với câu hỏi trên, một giải pháp có thể là có một số chương trình đưa ra tên và giá trị của các quy trình khi chúng được tạo. Sau đó, bạn có thể làm một cái gì đó như:

pids-names |
  grep some_program |
  cut -f 2 |
  while read pid; do
    process-pid "$pid"
  done

Vấn đề với điều này là nó đặt ra một câu hỏi cơ bản hơn, làm thế nào các pids và tên quy trình có thể được in khi chúng được tạo ra?

Tôi đã tìm thấy một chương trình được gọi ps-watcher, mặc dù vấn đề với nó là nó chỉ là một đoạn perlscript chạy liên tục psnên nó không thực sự giải quyết được vấn đề. Một tùy chọn khác là sử dụng auditdcó thể hoạt động nếu nhật ký được xử lý trực tiếp qua tail -f. Một giải pháp lý tưởng sẽ đơn giản và dễ mang theo hơn giải pháp này, mặc dù tôi sẽ chấp nhận một auditdgiải pháp nếu đó là lựa chọn tốt nhất.


1
Một lưu ý phụ thú vị là pid đầu tiên được tạo ra như một bản sao của quá trình tạo ( forkhoặc biến thể), sau đó chương trình mới được bắt đầu sử dụng một thành viên trong execgia đình. Vì vậy, bạn có thể muốn đăng nhập exec*, không phải fork.
derobert

2
Cách hiệu quả di động duy nhất mà tôi biết là sử dụng kế toán quy trình Unix thông thường, sẽ viết một bản ghi sau khi thoát quy trình. Nếu bạn muốn nắm bắt các quy trình khi chúng được tạo hoặc thực thi, có lẽ bạn cần những thứ dành riêng cho hệ thống, chẳng hạn như kiểm toán Linux, systemtap hoặc dtrace.
Đánh dấu Plotnick

Vì vậy, đối với câu hỏi trên, một giải pháp có thể là có một số chương trình đưa ra tên và giá trị của các quy trình khi chúng được tạo. - Khi chúng được tạo ra? Âm thanh những gì bạn nghĩ đến là một người quan sát (đây là những gì họ gọi họ trong thế giới trình duyệt web). Tôi đang tự hỏi liệu Python có phù hợp để đóng vai trò là "người bảo vệ cửa" không? Sự thật là Python có thể đào sâu vào hoạt động bên trong của hệ thống (ví dụ dbus).
cú pháp

1
@syntaxerror DBus khác xa với hoạt động bên trong của hệ thống trong trường hợp này - thực tế là về hai cấp độ trên những gì đang được thảo luận ở đây.
peterph

OK, trong biệt ngữ OSI, tầng được thảo luận ở đây có thể vẫn thấp hơn so với dbus. Tôi thừa nhận rằng tôi đã không suy nghĩ sâu sắc về việc liệu cả hai có ở cùng một tầng hay không.
cú pháp

Câu trả lời:


6

Câu trả lời dành riêng cho Linux:

perf-tools chứa một execsnoop thực hiện chính xác điều này. Nó sử dụng các tính năng dành riêng cho Linux như ftrace. Trên Debian, nó nằm trong gói perf-tools-không ổn định .

Ví dụ về tôi đang chạy man cattrong một thiết bị đầu cuối khác:

root@Zia:~# execsnoop 
TIME        PID   PPID ARGS
17:24:26  14189  12878 man cat 
17:24:26  14196  14189 tbl 
17:24:26  14195  14189 preconv -e UTF-8 
17:24:26  14199  14189 /bin/sh /usr/bin/nroff -mandoc -Tutf8 
17:24:26  14200  14189 less 
17:24:26  14201  14199 locale charmap 
17:24:26  14202  14199 groff -mtty-char -Tutf8 -mandoc 
17:24:26  14203  14202 troff -mtty-char -mandoc -Tutf8 
17:24:26  14204  14202 grotty 

Tôi nghi ngờ có một cách di động để làm điều này.


2

Right Way TM thực hiện việc này phụ thuộc rất nhiều vào hệ thống và kernel bạn đang thực sự chạy. DTrace nên hoạt động trên Solaris, Free / NetBSD và Linux.

Đối với Linux cụ thể, bạn có thể sử dụng ftrace (phải được kích hoạt vào thời gian biên dịch - thường là vậy) hoặc các sự kiện của Proc qua netlink - xem câu trả lời SO cho vấn đề để biết thêm chi tiết (và nhớ bỏ phiếu, điểm số ~ 30 so với 0 cho câu trả lời được chấp nhận trông buồn cười). Người theo dõi người nghèo có thể được thực hiện bằng cách sử dụng strace -eexec,fork(mặc dù với chi phí không hợp lý).

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.