2008-12-17 28 views
5

Tôi tên quá trình và tôi đã gửi tín hiệu kill() đến quy trình đó nhưng tôi cần PID của nó để gọi kill(). Tôi chỉ muốn sử dụng:Tìm PID của Quy trình theo Tên mà không sử dụng popen() hoặc hệ thống()

popen("pidof process_name"); 

là điều cuối cùng. Có cách nào khác để tìm ra quá trình 'PID? Một cách tôi có thể nghĩ là gửi một yêu cầu socket đến quá trình đó và yêu cầu PID của nó. Một cách khác là hơi quá phức tạp đối với một mã đơn giản mà tôi đang viết: để làm những gì pidof command's source code thực sự đang làm (nó sử dụng một hàm gọi find_pid_by_name() nhưng điều đó đang làm rất nhiều thứ).

Nếu không có giải pháp đơn giản là có thể, tôi đã làm điều này:

system("pkill <process_name>"); 

và kiểm tra mã trở lại của mình. Nhưng pkill sẽ có sẵn cho chắc chắn trên tất cả các máy Linux?

Trả lời

4

Bạn nói bạn đang sử dụng Linux. Nó không phải là giải pháp sạch nhất, nhưng bạn có thể đi qua mọi mục nhập trong/proc và kiểm tra tên quá trình trong cmdline dựa trên những gì bạn đang tìm kiếm.

+0

nên được khá thẳng về phía trước bằng cách sử dụng tăng :: regex và tăng :: hệ thống tập tin tôi nghĩ rằng –

+0

i một lần nhìn vào đầu ra strace của pidof, và figured nó hiện nó theo cùng một cách. (có thể đã thay đổi ở giữa, mặc dù) –

+2

đọc procfs là rất rẻ. Đối với mục đích cụ thể này, bạn sẽ không phải bắt đầu thực sự đọc cho đến khi bạn đạt đến PID 1000, sau đó bạn có 40 - 60 để kiểm tra. Đừng nghĩ về nó như đọc một FS thông thường, rẻ hơn nhiều. –

4

Sử dụng sysctl - Example code

EDIT - nó có sẵn trong Linux see here

+0

Cảm ơn rất nhiều! Tôi sẽ xem xét điều này. – Srikanth

+1

Tính năng này chỉ hoạt động trên * BSD chứ không phải Linux. – ephemient

0

Điều này dường như làm việc tốt cho tôi.

Bạn có thể muốn cung cấp cho đường dẫn đầy đủ của quá trình, mặc dù sợ rằng bạn giết một quá trình có tên tương tự.

Ưu điểm chính của việc này là bạn có thể chỉ định tín hiệu bạn muốn gửi.

system("killall -s 9 process_name"); 
+0

Đây không phải là khác biệt so với phiên bản pkill ... –

0

tại sao không sử dụng fcntl với F_GETOWN?

+0

Điều đó chỉ hoạt động nếu gọi fcntl trên bộ mô tả ổ cắm và cẩn thận phải thực hiện để nhận ra nếu bạn nhận được PID hoặc nhóm xử lý (kết quả âm tính từ fcntl). Việc gọi fcntl trên một tệp bình thường với F_GETOWN không được chỉ định trong POSIX. http://www.opengroup.org/onlinepubs/009695399/functions/fcntl.html –

2

Đọc Procfs rất rẻ, nhiều người nghĩ đến việc lặp qua/proc như họ sẽ lặp lại thông qua /, nó thực sự không phải là trường hợp nào cả.

Tiết kiệm thời gian bằng cách bỏ qua bất kỳ mục nhập nào dưới 1000, không có ý nghĩa trong việc kiểm tra các chuỗi hạt nhân. Vì vậy, về cơ bản .. sau khi opendir(), nếu strtoint() nghĩ rằng mục nhập là một int, và int đó là lớn hơn hoặc bằng 1000, chỉ cần đọc/proc /% d/stat.

Cố gắng tránh sự thôi thúc chỉ giải quyết liên kết 'exe', vì điều đó sẽ không cho bạn biết trạng thái của quá trình sẽ nhận tín hiệu. Ví dụ, nếu mục tiêu là trong trạng thái 'D' (đĩa ngủ), bạn muốn biết là tín hiệu sẽ không được gửi ngay lập tức, hoặc có lẽ không bao giờ, nếu trạng thái D là lâu năm.

Trên hầu hết các hệ thống, sẽ có 70 - 120 quy trình để kiểm tra và bạn thường sẽ tìm được mục tiêu của mình trước khi kết thúc.

+0

@tinkertim: Cảm ơn bạn đã tip, không biết đọc trong/proc không giống như đọc một FS! – Srikanth

2

Bạn đề cập đến, "Một cách tôi có thể nghĩ là gửi yêu cầu socket đến quá trình đó và yêu cầu PID của nó." Có vẻ như quá trình bạn đang cố gắng giết là một chương trình bạn đã viết.

Nếu trường hợp đó xảy ra, điều cần làm là lưu trữ pid trong một tệp (thường dưới/var/run, nếu bạn có quyền truy cập) trong khi chương trình đang chạy và xóa tệp khi chương trình thoát.Bằng cách đó, hãy phát hiện xem chương trình có đang chạy đơn giản như là

if kill -0 $(cat /var/run/myprog.pid 2>/dev/null) 2>/dev/null; then 
    echo Running! 
else 
    rm -f /var/run/myprog.pid 
    echo "Not running." 
end 

10 Nghiên cứu cẩn thận về tất cả các tác động của đoạn mã trên có thể dạy bạn rất nhiều về cách hoạt động của các tệp PID. Hoặc bạn chỉ có thể yêu cầu giải thích chi tiết hơn.

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