2012-01-26 18 views
6

Tôi đang sử dụng python-daemon và gặp sự cố khi tôi kill -9 xử lý, nó để lại một pidfile phía sau (ok) và lần sau tôi chạy chương trình của tôi nó không hoạt động trừ khi tôi đã gỡ bỏ pidfile bằng tay (không ok).bối cảnh python-daemon không bắt đầu khi một tệp PID cũ có mặt

Tôi bắt tất cả ngoại lệ để context.close() được gọi trước khi chấm dứt - khi điều này xảy ra (ví dụ: trên kill) tệp /var/run/mydaemon.pid* bị xóa và daemon tiếp theo chạy thành công. Tuy nhiên, khi sử dụng SIGKILL (kill -9), tôi không có cơ hội để gọi context.close() và các tệp/var/run vẫn còn. Trong trường hợp này, lần sau khi tôi chạy chương trình của tôi nó không bắt đầu thành công - quá trình ban đầu trả về, nhưng quá trình daemonized khối tại context.open().

Có vẻ như python-daemon nên nhận thấy rằng có một pidfile cho một quá trình không còn tồn tại nữa, và xóa nó đi, nhưng điều đó không xảy ra. Tôi có nên làm điều này bằng tay không?

Lưu ý: Tôi không sử dụng with vì mã này chạy trên Python 2,4

from daemon import DaemonContext 
from daemon.pidlockfile import PIDLockFile 

context = DaemonContext(pidfile = PIDLockFile("/var/run/mydaemon.pid")) 
context.open() 

try: 
    retry_main_loop() 
except Exception, e: 
    pass 
context.close() 

Trả lời

1

Nếu bạn đang chạy Linux và các khóa mức xử lý có thể chấp nhận được, hãy đọc tiếp.

Chúng tôi cố gắng lấy khóa. Nếu nó không thành công, hãy kiểm tra xem khóa có được bằng một tiến trình đang chạy hay không. Nếu không, hãy mở khóa và tiếp tục.

from lockfile.pidlockfile import PIDLockFile 
from lockfile import AlreadyLocked 

pidfile = PIDLockFile("/var/run/mydaemon.pid", timeout=-1) 
try: 
    pidfile.acquire() 
except AlreadyLocked: 
    try: 
     os.kill(pidfile.read_pid(), 0) 
     print 'Process already running!' 
     exit(1) 
    except OSError: #No process with locked PID 
     pidfile.break_lock() 

#pidfile can now be used to create DaemonContext 

Edit: Hình như PIDLockFile chỉ có sẵn trên lockfile> = 0,9

+0

Đó là hai năm trước để bộ nhớ của tôi rất mơ hồ, nhưng yeah, tôi nghĩ rằng đây là cách tôi đã làm nó (những gì tôi có nghĩa của "làm điều này bằng tay" được tham chiếu trong câu hỏi). Đánh dấu là câu trả lời vì tại sao không. – kdt

1

Với kịch bản được cung cấp here file pid vẫn còn trên kill -9 như bạn nói, nhưng kịch bản cũng dọn dẹp đúng khi khởi động lại.

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