2011-01-04 37 views
13

Tôi sử dụng bộ lập lịch (trình lên lịch Rufus) để khởi chạy một quá trình có tên là "ar_sendmail" (từ ARmailer), mỗi phút.Làm cách nào để kiểm tra quá trình đang chạy với Ruby?

Quy trình KHÔNG được khởi chạy khi đã có quá trình chạy như vậy để không ăn hết bộ nhớ.

Làm cách nào để kiểm tra xem liệu quá trình này có đang chạy không? Điều gì xảy ra sau unless bên dưới?

scheduler = Rufus::Scheduler.start_new 

    scheduler.every '1m' do 

    unless #[what goes here?] 
     fork { exec "ar_sendmail -o" } 
     Process.wait 
    end 

    end 

end 

Trả lời

23
unless `ps aux | grep ar_sendmai[l]` != "" 
+0

Cảm ơn! 1 câu hỏi trở lại: Tại sao các dấu ngoặc xung quanh "l" của "ar_sendmail"? – TomDogg

+8

nó để loại bỏ quá trình gọi từ grep cho một quá trình phù hợp với ar_sendmail - nếu không bạn sẽ nhận được kết quả cho 'grep ar_sendmail' – stef

+0

Muchas gracias, señor! – TomDogg

8
unless `pgrep -f ar_sendmail`.split("\n") != [Process.pid.to_s] 
+1

Tôi nghĩ rằng đây là một giải pháp tốt hơn nhiều vì bạn không phải sử dụng giá đỡ để loại trừ quá trình gọi. – while

+0

EDIT: Cần chia nhỏ trên \ n vì cấu trúc trả về của pgrep. – dahlberg

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