Đọc từ một đường ống, ghi vào một tập tin
Nếu bạn muốn daemon đọc đầu vào được tạo bởi một số quy trình tùy ý, bạn cần kết nối quy trình đó với một đường ống. Ở đây, quá trình tùy ý là bạn lặp lại các lệnh và nó sẽ chạy trong một bối cảnh khác. Vì vậy, tạo một ống có tên (thường được gọi là fifo trong bối cảnh unix).
mkfifo /var/run/daemon.fifo
</var/run/daemon.fifo /path/to/daemond --option >daemon.log
Và chỉ cần viết lệnh vào đường ống:
echo 'FORWARD 10' >/var/run/daemon.fifo
echo 'LEFT 72' >/var/run/daemon.fifo
Tuy nhiên, điều này dường như không hoạt động: có khả năng daemon sẽ thoát khi thấy phần cuối của tệp trên đầu vào tiêu chuẩn của nó, xảy ra ngay khi quá trình đầu tiên ghi vào đường ống kết thúc. Bạn có thể sử dụng tail -f
để tránh vấn đề đó.
</var/run/daemon.fifo tail -c +1 -f | {
echo $$ >/var/run/daemon.pid
exec /path/to/daemond --option >daemon.log
}
Với một số tail
triển khai, bạn có thể bị cắn bởi bộ đệm: tail
quá trình sẽ đợi cho đến khi nó tích lũy đủ byte để phát ra một số đầu ra. Tôi không nghĩ rằng điều này có thể giải quyết được trong hộp công cụ POSIX; nếu đó là một vấn đề, hãy sử dụng chương trình C hoặc Perl hoặc Python tầm thường. Theo như tôi có thể nói tail
từ GNU coreutils (như được tìm thấy trên Linux và các nơi khác) là an toàn về mặt này.
Khi bạn dừng daemon, echo >/var/run/daemon.fifo
sẽ giết tail
quá trình.
Bắt đầu chương trình bên trong màn hình
Thay vì gọi trình nền trực tiếp từ trình quản lý dịch vụ của bạn (bạn có thực sự chỉ sử dụng SysV init hoặc một cái gì đó bổ sung như tập lệnh bao bọc hoặc Upstart không?), Hãy gọi
screen -c daemon.screenrc -L -d -m -S daemon_name /path/to/daemond --option
Vì daemon sẽ không phải là một quy trình con của người quản lý dịch vụ, bạn cần đảm bảo gửi tín hiệu đến đúng quy trình. Làm thế nào để làm điều đó phụ thuộc vào chính xác cách daemon được bắt đầu và bằng gì.
Về mặt kỹ thuật có thể gắn quy trình đang chạy vào thiết bị đầu cuối, nhưng có nguy cơ bạn sẽ làm hỏng chương trình, vì vậy đây chắc chắn là một hệ thống sản xuất.
Các -L
tùy chọn làm cho màn hình ghi tất cả những gì xuất hiện trong cửa sổ của nó vào một tập tin. Tên tập tin được đưa ra daemon.screenrc
với logfile
chỉ thị.