2008-09-01 27 views
5

Có cách nào dễ dàng để biết liệu tập lệnh ruby ​​đã chạy chưa và sau đó xử lý tập lệnh thích hợp? Ví dụ: Tôi có một tập lệnh gọi là really_long_script.rb. Tôi có nó cronned để chạy mỗi 5 phút. Khi nó chạy, tôi muốn xem nếu chạy trước đó vẫn chạy và sau đó ngừng thực hiện kịch bản thứ hai. Bất kỳ ý tưởng?Xác định xem tập lệnh ruby ​​đã chạy chưa

Trả lời

9

Các ps là một cách thực sự nghèo làm điều đó và có lẽ mở cửa cho điều kiện chủng tộc.

Cách Unix/Linux truyền thống là viết PID vào một tệp (thường là trong/var/run) và kiểm tra xem tệp đó có tồn tại khi khởi động hay không.

ví dụ: pidfile được đặt tại /var/run/myscript.pid, sau đó bạn kiểm tra xem liệu nó có tồn tại trước khi chạy chương trình hay không. Có một vài thủ thuật để tránh điều kiện chủng tộc liên quan đến việc sử dụng O_EXCL (loại trừ khóa) để mở tệp và liên kết tượng trưng.

Tuy nhiên, bạn không nên cố mã để tránh điều kiện cuộc đua bằng cách sử dụng các hoạt động nguyên tử trên hệ thống tệp.

Để lưu tái phát minh ra bánh xe, bạn có thể muốn nhìn vào http://rubyforge.org/projects/pidify/

0

Trong bash:

if ps aux | grep really_long_script.rb | grep -vq grep 
then 
    echo Script already running 
else 
    ruby really_long_script.rb 
fi 
0

Bạn nên có lẽ cũng kiểm tra xem quá trình này được thực sự chạy, do đó nếu kịch bản của bạn chết mà không làm sạch bản thân lên, nó sẽ chạy thời gian tới thay vì chỉ cần kiểm tra rằng /var/run/foo.pid tồn tại và thoát.

0

Highlander

Mô tả

Một viên ngọc mà đảm bảo chỉ có một thể hiện của kịch bản chính của bạn đang chạy. Tóm lại, chỉ có thể có một.

Lắp đặt

gem install highlander 

Tóm tắt

require 'highlander' # This should be the -first- thing in your code. 
# Your code here 

Trong khi đó, trở lại trên dòng lệnh ...

# First attempt, works. Assume it's running in the background. 
ruby your_script.rb 

# Second attempt while the first instance is still running, fails. 
ruby your_script.rb # => RuntimeError 

Ghi chú

Đơn giản chỉ cần yêu cầu đá quý Highlander đảm bảo tha Chỉ một trường hợp của tập lệnh đó không thể khởi động lại được. Nếu bạn cố gắng khởi động lại nó , nó sẽ tăng một RuntimeError.

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