Tôi đang viết một tập lệnh Perl để phân tích cú pháp logfiles để thu thập các PID và sau đó kiểm tra xem liệu PID đó có đang chạy hay không. Tôi đang cố gắng nghĩ ra cách tốt nhất để thực hiện kiểm tra đó. Rõ ràng, tôi có thể làm một cái gì đó như:
system("ps $pid > /dev/null") && print "Not running\n";
Tuy nhiên, tôi muốn tránh cuộc gọi hệ thống nếu có thể. Do đó, tôi nghĩ rằng tôi có thể sử dụng /proc
hệ thống tập tin (tính di động không phải là vấn đề đáng lo ngại, điều này sẽ luôn chạy trên hệ thống Linux). Ví dụ:
if(! -d "/proc/$pid"){
print "Not running\n";
}
Điều đó có an toàn không? Tôi có thể luôn luôn nghĩ rằng nếu không có /proc/$pid/
thư mục thì PID liên quan không chạy? Tôi hy vọng như vậy vì ps
bản thân AFAIK cũng nhận được thông tin từ /proc
đó nhưng vì đây là mã sản xuất, tôi muốn chắc chắn.
Vì vậy, có thể có trường hợp một quy trình đang chạy không có /proc/PID
thư mục hoặc nơi /proc/PID
thư mục tồn tại và quy trình không chạy? Có bất kỳ lý do để thích phân tích cú pháp ps
hơn kiểm tra sự tồn tại của thư mục?
kill -0
là phương pháp tốt nhất), điều này chỉ cho bạn biết liệu có một quy trình đang chạy với PID đã cho hay không . Nó không cho bạn biết liệu quy trình có còn chạy sau một phần nghìn giây hay không và nó không cho bạn biết liệu quy trình đó có phải là quy trình bạn quan tâm hay quy trình không liên quan đã được gán cùng một PID sau khi quy trình thú vị bị chết . Hầu như luôn luôn là một sai lầm để kiểm tra xem một PID nhất định có đang chạy hay không : có rất ít trường hợp điều này không dễ xảy ra trong điều kiện chủng tộc.
kill
chức năng perl sử dụng tín hiệu 0 không giết chết nhưng cho biết nếu bạn có thể làm như vậy (tức là bạn cần có quyền để báo hiệu quá trình đó).