2009-01-18 34 views
23

Có một số cách để làm điều này, nhưng tôi không chắc chắn một trong số đó là tốt nhất.Cách tốt nhất để đảm bảo chỉ một phiên bản của chương trình Perl đang chạy?

Đây là những gì tôi có thể nghĩ:

  • Look cho quá trình sử dụng pgrep.
  • Yêu cầu tập lệnh tự khóa bằng đàn, sau đó kiểm tra xem nó có bị khóa mỗi khi nó chạy không.
  • Tạo tệp pid trong /var/run/program_name.pid và kiểm tra sự tồn tại và so sánh các pids nếu cần.

Có thể có nhiều cách để thực hiện việc này. Bạn nghĩ gì là cách tiếp cận tốt nhất?

+0

Câu hỏi tương tự, về Bash liên quan: http://stackoverflow.com/questions/455911/whats-the-best-way-to-make-sure-only-one-instance-of-a-perl-program- đang chạy – codeforester

Trả lời

34

Có nhiều cách để thực hiện. Tệp PID là cách truyền thống để thực hiện. Bạn cũng có thể giữ một khóa trên một tệp, ví dụ như chính chương trình đó. Đoạn mã nhỏ này sẽ thực hiện thủ thuật:

use Fcntl ':flock'; 
open my $self, '<', $0 or die "Couldn't open self: $!"; 
flock $self, LOCK_EX | LOCK_NB or die "This script is already running"; 

Một lợi thế so với tệp PID là tệp tự động mở khóa khi chương trình thoát. Việc triển khai một cách đáng tin cậy là dễ dàng hơn nhiều.

+0

+1: điều kiện đơn giản, di động và không có chủng tộc. –

+0

dường như không hoạt động tốt với ActiveState Perl ... người khác đã thử nó? – golimar

+0

+1 Giải pháp hay, mặc dù tôi sẽ thêm một số dấu ngoặc để làm cho mã rõ ràng hơn một chút. Có phải câu lệnh 'hoặc' trong dòng thứ hai chỉ hoạt động trên $ 0 hoặc kết quả của câu lệnh mở không? Chỉ cần không rõ ràng với tôi. – MikeKulls

9

Làm thủ thuật tệp PID cũ.

  • quá trình khởi động
  • xem nếu có một tập tin gọi là "myprog.PID"
  • nếu như vậy, phàn nàn ầm ĩ và thoát
  • nếu không, tạo ra một tập tin gọi là "myprog.PID" và sau đó tiếp tục

HTH

cổ vũ,

Rob

+5

Điều này có thể được cải thiện bằng cách đọc PID từ tệp và kiểm tra xem liệu quá trình đó vẫn tồn tại (sử dụng kill 0, $ pid). Nếu không, hãy bỏ qua tệp pid cũ và tiếp tục. Điều này giúp phục hồi một cách duyên dáng hơn từ một quá trình bị lỗi. –

+0

+1 để kiểm tra xem pid tìm thấy trong tệp có tồn tại hay không, hãy giết bằng tín hiệu 0 tồn tại chỉ cho điều đó. – Keltia

+2

Lưu ý rằng điều này cũng có một điều kiện chủng tộc nếu hai quá trình cố gắng bắt đầu cùng một lúc, hãy kiểm tra tệp đó giống nhau và không phải tệp pid. –

2

Tất cả các tùy chọn mà bạn liệt kê đều ổn. Một điều với điều này, mặc dù, là nhận thức được rằng trong trường hợp hiếm hoi, bạn có thể kết thúc với một quá trình chạy trong một thời gian rất dài (tức là, bị mắc kẹt chờ đợi một cái gì đó). Bạn có thể muốn suy nghĩ về việc giữ một mắt trên bao lâu chạy dụ khác đã chạy và có thể gửi cho mình một cảnh báo nếu nó vượt quá một khoảng thời gian nhất định (chẳng hạn như một ngày có lẽ).

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