2009-05-19 24 views
10

Tôi biết điều này có thể được kiểm tra từ/proc/PID thư mục,cách điều tra quy trình đang thực hiện?

nhưng không biết làm thế nào để,

có thể bất kỳ một chỉ cho tôi đường đi?

+0

Điều này thuộc về serverfault.com, tôi nghĩ (yêu cầu giám sát quá trình qua hệ thống tệp). Ngoài ra, bạn cần phải cho chúng tôi biết bạn muốn theo dõi một quy trình nào để giúp bạn tốt hơn –

+0

Tôi đang tìm kiếm một chương trình php – omg

+0

Theo dõi nó ... tiêu thụ bộ nhớ của nó, hoạt động mạng của nó, ai đã gọi nó, ...? –

Trả lời

5

Nếu bạn đang tìm kiếm giám sát các cuộc gọi hệ thống đang được thực hiện bởi một quy trình, hãy xem xét sử dụng strace.

+0

Tôi đang tìm kiếm một chương trình giám sát php. Điều đó có hữu ích không? – omg

+0

Vâng ít nhất nó sẽ cho bạn biết những gì hệ thống gọi là thông dịch viên PHP đang gọi. Tùy thuộc vào những gì kịch bản PHP đang làm nó có thể hữu ích hoặc nó có thể không. Nếu không, bạn có thể muốn xem xét gỡ lỗi PHP. –

+0

Tôi đang theo dõi một robot xmpp – omg

0

Tôi dựa vào lệnh strace. Nhưng nó chỉ cho biết những gì hệ thống gọi là quá trình được thực hiện. Nó có thể là đủ mặc dù ...

Có thể ràng buộc một quy trình đang chạy đến strace khi chạy.

Rõ ràng, gdb cũng có thể được sử dụng.

+0

Bạn có thể tạo một bản demo về cách sử dụng strace để cho biết chương trình PHP đang làm gì không? – omg

0

loại thông tin bạn đang tìm kiếm? Các thư mục giả dưới/proc/pid nên khá tự giải thích. Nó thực sự phụ thuộc vào những gì bạn đang tìm kiếm. Đối với việc sử dụng mem và cpu chung, một công cụ như trên có lẽ tốt hơn vì nó cập nhật số liệu thống kê cho một khoảng thời gian được định cấu hình

+0

Tôi đang theo dõi một robot xmpp, nó dễ dàng thoát ra trong khi quá trình này vẫn còn sống, tôi đang điều tra lý do. – omg

8

Thông thường strace là câu trả lời cho câu hỏi này. Phương pháp đơn giản nhất là chạy lệnh bằng strace trực tiếp, ví dụ:

[email protected]:~$ strace ls 
execve("/bin/ls", ["ls"], [/* 16 vars */]) = 0 
brk(0)         = 0x9fa8000 
access("/etc/ld.so.nohwcap", F_OK)  = -1 ENOENT (No such file or directory) 
mmap2(NULL, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0xb7f0a000 
access("/etc/ld.so.preload", R_OK)  = -1 ENOENT (No such file or directory) 

Điều này không làm việc cho các quy trình đang chạy như PHP. May mắn là bạn cũng có thể gắn dấu vết vào một quá trình hiện có bằng cách sử dụng tham số -p. Ví dụ:

[email protected]:~$ strace -p 3761 
Process 3761 attached - interrupt to quit 
select(16, [5 7 8], NULL, [5 7 8], {0, 580000}) = 0 (Timeout) 
alarm(0)        = 62 
rt_sigprocmask(SIG_BLOCK, [ALRM], [], 8) = 0 
rt_sigaction(SIGALRM, {SIG_DFL}, {0x809a270, [], 0}, 8) = 0 
rt_sigprocmask(SIG_SETMASK, [], NULL, 8) = 0 

cho daemon mà đẻ trứng quá trình khác mà bạn có thể cần phải sử dụng tham số -f là tốt.

Bên cạnh đường cong luôn hữu ích, bạn cũng có thể muốn xem ltrace. ltrace tương tự như strace, nhưng nó cho thấy các cuộc gọi thư viện thay vì các cuộc gọi hệ thống. Ví dụ:

[one;~]-6> ltrace ls 
__libc_start_main(0x804e5f0, 1, 0xbfdb7254, 0x8059a10, 0x8059a00 <unfinished ...> 
setlocale(6, "")                     = "LC_CTYPE=en_GB.UTF-8;LC_NUMERIC="... 
bindtextdomain("coreutils", "/usr/share/locale")             = "/usr/share/locale" 
textdomain("coreutils")                   = "coreutils" 
__cxa_atexit(0x8051860, 0, 0, 0xb7f65ff4, 0xbfdb71b8)           = 0 
isatty(1)                      = 1 
getenv("QUOTING_STYLE")                   = NULL 

Xin lưu ý rằng bạn cũng sẽ thấy số lượng cuộc gọi libc nội bộ hợp lý, vì vậy đầu ra có thể tiết kiệm hơn mong đợi.

+0

Nó cũng là một trợ giúp lớn đối với tôi khi tôi đã học về 'strace -f', nó sẽ theo các tiến trình con của cái bạn đang truy tìm. Cuối cùng, thông tin bổ sung thường có thể được truy xuất lại khi nhìn vào nội dung của '/ proc/' đối với các số ở bên trái của 'strace -f'. – erikbwork

Các vấn đề liên quan