Tôi muốn một daemonizer có thể biến một tập lệnh hoặc lệnh chung, tùy ý thành một daemon .
Có hai trường hợp phổ biến mà tôi muốn giải quyết:
Tôi có một tập lệnh sẽ chạy mãi mãi. Nếu nó bị chết (hoặc khi khởi động lại), hãy khởi động lại nó. Đừng để có hai bản sao chạy cùng một lúc (phát hiện xem một bản sao đã chạy hay chưa và không khởi chạy nó trong trường hợp đó).
Tôi có một tập lệnh đơn giản hoặc lệnh dòng lệnh mà tôi muốn tiếp tục thực thi lặp đi lặp lại mãi mãi (với một khoảng dừng ngắn giữa các lần chạy). Một lần nữa, không cho phép hai bản sao của tập lệnh chạy cùng một lúc.
Tất nhiên, việc viết một vòng lặp "while (true)" xung quanh tập lệnh trong trường hợp 2 và sau đó áp dụng giải pháp cho trường hợp 1 là rất nhỏ, nhưng một giải pháp chung hơn sẽ chỉ giải quyết trực tiếp trường hợp 2 vì điều đó áp dụng cho tập lệnh trong trường hợp 1 như tốt (bạn có thể chỉ muốn tạm dừng ngắn hơn hoặc không tạm dừng nếu kịch bản không có ý định chết (tất nhiên nếu kịch bản thực sự không bao giờ chết thì tạm dừng thực sự không quan trọng)).
Lưu ý rằng giải pháp không nên liên quan đến việc thêm mã khóa tệp hoặc ghi PID vào các tập lệnh hiện có.
Cụ thể hơn, tôi muốn một chương trình "daemonize" mà tôi có thể chạy
% daemonize myscript arg1 arg2
hoặc, ví dụ,
% daemonize 'echo `date` >> /tmp/times.txt'
điều này sẽ giữ cho danh sách ngày càng tăng được thêm vào times.txt. (Lưu ý rằng nếu (các) đối số để daemonize là một tập lệnh chạy mãi mãi như trong trường hợp 1 ở trên, thì daemonize sẽ vẫn làm đúng, khởi động lại nó khi cần thiết.) Sau đó, tôi có thể đặt một lệnh như trên trong .login của mình và / hoặc di chuyển nó hàng giờ hoặc hàng phút (tùy thuộc vào mức độ lo lắng của tôi về việc nó chết bất ngờ).
NB: Tập lệnh daemonize sẽ cần nhớ chuỗi lệnh mà nó đang daemonizing để nếu chuỗi lệnh tương tự được daemonize một lần nữa, nó sẽ không khởi chạy bản sao thứ hai.
Ngoài ra, giải pháp lý tưởng nên hoạt động trên cả OS X và linux nhưng các giải pháp cho cái này hay cái khác đều được hoan nghênh.
CHỈNH SỬA: Sẽ ổn nếu bạn phải gọi nó bằng sudo daemonize myscript myargs
.
(Nếu tôi nghĩ về điều này hoàn toàn sai hoặc có những giải pháp từng phần nhanh chóng và bẩn thỉu, tôi cũng muốn nghe điều đó.)
Tái bút: Trong trường hợp nó hữu ích, đây là một câu hỏi tương tự dành riêng cho python.
Và này câu trả lời cho một câu hỏi tương tự có những gì dường như là một thành ngữ hữu ích cho một demonizing nhanh chóng-và-bẩn của một kịch bản tùy ý: