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
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/
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
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.
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.
- 1. Bạn đã thay thế makefiles bằng tập lệnh ruby chưa?
- 2. Làm cách nào để phát hiện xem tập lệnh PHP đã chạy chưa?
- 3. Kiểm tra xem hằng số đã được xác định chưa
- 4. R: xác định xem tập lệnh có đang chạy trong Windows hoặc Linux
- 5. tập lệnh đơn giản để kiểm tra xem trang web đã được cập nhật chưa
- 6. Cách xác định xem người dùng đã chọn tệp để tải tệp lên chưa?
- 7. Xương sống: Cách xác thực xem Mô hình đã tồn tại trong Bộ sưu tập chưa?
- 8. Chức năng vimrc là gì để xác định xem bộ đệm đã được sửa đổi chưa?
- 9. Kohana: Có cần kiểm tra xem SYSPATH đã được xác định chưa?
- 10. Cách xác định xem người dùng đã cuộn xuống dưới cùng của UITableView chưa?
- 11. Cách xác định xem nhà cung cấp VFPOLEDB đã được cài đặt/đăng ký chưa?
- 12. Làm cách nào để khởi chạy tập lệnh ruby từ dòng lệnh bằng tên của nó?
- 13. Cách lập trình xác định phiên bản IE đã cài đặt từ tập lệnh
- 14. Xem tất cả biến đã xác định
- 15. Xác định xem ứng dụng hiện tại có được kích hoạt hay không (đã tập trung)
- 16. Chạy tập lệnh Python trên tệp đã chọn
- 17. Chạy tập lệnh bên trong C#
- 18. Kiểm tra xem tập lệnh php có đang chạy không
- 19. làm cách nào để xác định xem tập lệnh python được nhập dưới dạng mô-đun hay chạy dưới dạng tập lệnh?
- 20. Chạy thư viện Ruby từ dòng lệnh
- 21. Tập lệnh để chạy các tập lệnh khác trong sqldeveloper
- 22. Xác định xem thay đổi ngày đã xảy ra
- 23. Xác thực định dạng ngày trong tập lệnh shell
- 24. Làm cách nào để xác định từ tập lệnh PowerShell trong thời gian chạy máy chủ đang chạy?
- 25. Chạy các lệnh tập lệnh sau SSH
- 26. Làm cách nào để xác định xem tập lệnh python được thực thi từ crontab?
- 27. Đã xác định tràn cho VHDL numeric_std đã ký/chưa ký
- 28. Tập lệnh Bash - xác định xem tệp có được sửa đổi không?
- 29. Thực thi tập lệnh ruby từ cron
- 30. Viết kịch bản bằng Scala: Cách khởi chạy tập lệnh chưa được biên dịch?