Tôi đang viết một kịch bản shell mà tôi muốn chạy như một daemon khi khởi động mà không sử dụng các công cụ bên ngoài như daemontools hoặc daemonize .
Linux Daemon Viết HOWTO
Theo Linux Daemon Writing HOWTO , một daemon thích hợp có các đặc điểm sau:
- dĩa từ quá trình cha mẹ
- đóng tất cả các file descriptor (ví dụ
stdin
,stdout
,stderr
) - mở nhật ký để viết (nếu được cấu hình)
- thay đổi thư mục làm việc thành một liên tục (thường
/
) - Đặt lại mặt nạ chế độ tập tin (umask)
- tạo ID phiên duy nhất (SID)
daemonize Giới thiệu
Các daemonize Giới thiệu đi xa hơn, nói rằng một daemon tiêu biểu thêm:
- tách khỏi thiết bị đầu cuối điều khiển của nó (nếu có) và bỏ qua tất cả các tín hiệu đầu cuối
- tách ra khỏi nhóm quy trình của nó
- tay cầm
SIGCLD
Làm thế nào tôi sẽ làm tất cả điều này trong một sh
, dash
hoặc bash
kịch bản chỉ với công cụ Linux phổ biến?
Kịch bản sẽ có thể chạy trên càng nhiều phân phối càng tốt mà không cần phần mềm bổ sung, mặc dù Debian là trọng tâm chính của chúng tôi.
LƯU Ý: Tôi biết có rất nhiều câu trả lời trên mạng StackExchange khuyến nghị sử dụng nohup
hoặc setsid
, nhưng cả hai phương pháp này đều không giải quyết được tất cả các yêu cầu ở trên.
EDIT: Trang chủ daemon (7) cũng đưa ra một số gợi ý, mặc dù dường như có một số khác biệt giữa các SysV
daemon kiểu cũ và các kiểu mới hơn systemd
. Vì khả năng tương thích với nhiều loại distro rất quan trọng, vui lòng đảm bảo câu trả lời làm rõ mọi khác biệt.
daemon
và những thứ khác là để chạy các tập lệnh shell tùy ý không có điều khoản để chạy như một daemon. Vì bạn là tác giả, hoàn toàn kiểm soát cách viết tập lệnh đó, làm cho nó có thể được khởi chạy từ tập lệnh systemfile hoặc rc.d. Bạn đã chỉ định "Đúng"!