2009-12-14 21 views
7

Tôi cần tìm đúng cách để ngăn chặn hai trường hợp đang chạy của chương trình (Python) của tôi. Tôi hiện đang sử dụng phương pháp sau.Làm thế nào để tránh nhiều trường hợp của một chương trình?

Trên Windows,

os.popen('wmic process get caption,processid | findstr `programname.exe`') 

Trên Linux,

os.popen('ps x | grep `programname`') 

Có vẻ như để làm việc tốt cho bây giờ. Phương pháp này có đúng không? Ai đó có thể gợi ý cho tôi một cách tốt hơn?

chỉnh sửa: Cảm ơn người trả lời, Có vấn đề gì với các phương pháp trên không? Tôi đã thử cách tệp pid cho Linux. Điều gì sẽ xảy ra nếu tệp pid bị xóa?

+1

Trùng lặp: http://stackoverflow.com/questions/380870/python-single-instance-of-program –

+0

Liên quan: http://stackoverflow.com/questions/220525/ensuring-a-single-instance-of -an-application-in-linux # 221159 –

+0

Về cơ bản đây là bản sao của [python-single-instance-of-program] (http://stackoverflow.com/questions/380870/python-single-instance-of- chương trình) câu hỏi. –

Trả lời

5

Có rất nhiều cách:

  1. có một "tập tin ví dụ" trong/var/run hoặc tương tự (cross-platform)
  2. sử dụng một ổ cắm cố định (cross-platform)
  3. sử dụng dbus để đăng ký tên (linux)

Điều bạn cần là một dịch vụ (bên ngoài ứng dụng) quản lý không gian tên nơi có các id duy nhất có sẵn &.

1

Đối với Linux, hãy xem câu trả lời từ jldupont. Đối với các cửa sổ, sử dụng phương pháp CreateMutex, để tạo một mutex được đặt tên. Xem: http://msdn.microsoft.com/en-us/library/ms686927%28VS.85%29.aspx

+0

Câu hỏi này là về Python, nhưng liên kết đó dường như là tất cả về C++ và do đó không liên quan. Hay tôi đang thiếu một cái gì đó? – ArtOfWarfare

1

trên Linux, tôi sử dụng để viết một pidfile, khoảng:

if (pidfile already exists) 
    read pidfile content 
    if (/proc/<pid>/exec == my executable) 
     already running, exit 
    else 
     it´s a stale pidfile, delete it 
write my own pid to pidfile 
start the 'real' work 

thời gian gần đây, tôi đã nghe nói về công cụ flock(1). Nó rất dễ dàng để sử dụng trong các kịch bản bash:

(flock -n 200 || exit 
    # ... commands executed under lock ... 
) 200>/var/lock/mylockfile 

và không quá khó để sử dụng từ ngôn ngữ lập trình 'thực tế', chỉ cần mở một tập tin và cố gắng để có được một flock(2) trên đó.

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