Прочитайте з труби, запишіть у файл
Якщо ви хочете, щоб демон зчитував вхід, отриманий деяким довільним процесом, вам потрібно підключити цей процес до труби. Тут довільний процес - це відголос команд, і він запускається в іншому контексті. Тому створіть названу трубу (її часто називають фіфою в контекстах Unix).
mkfifo /var/run/daemon.fifo
</var/run/daemon.fifo /path/to/daemond --option >daemon.log
І просто запишіть команди в трубу:
echo 'FORWARD 10' >/var/run/daemon.fifo
echo 'LEFT 72' >/var/run/daemon.fifo
Однак це навряд чи вдасться: є хороший шанс, що демон вийде, коли побачить кінець файлу на своєму стандартному вході, що відбувається, як тільки перший процес, який записує в трубу, закінчується. Ви можете використовувати, tail -f
щоб уникнути цієї проблеми.
</var/run/daemon.fifo tail -c +1 -f | {
echo $$ >/var/run/daemon.pid
exec /path/to/daemond --option >daemon.log
}
З деякими tail
реалізаціями ви можете бути покусані буферизацією: tail
процес буде чекати, поки він набере достатньо байтів, щоб видати деякий вихід. Я не думаю, що це вирішується в панелі інструментів POSIX; якщо це проблема, використовуйте тривіальну програму C або Perl або Python. Наскільки я можу сказати, що tail
GNU coreutils (як це можна знайти в Linux та інших місцях) є безпечним у цьому відношенні.
Коли ви зупините демон, echo >/var/run/daemon.fifo
вб'є tail
процес.
Запуск програми всередині екрану
Замість того, щоб викликати демона безпосередньо у вашого менеджера сервісів (ви справді використовуєте тільки SysV init чи щось додаткове, наприклад, скрипти для обгортки чи Upstart?), Викликайте
screen -c daemon.screenrc -L -d -m -S daemon_name /path/to/daemond --option
Оскільки демон не буде дочірнім процесом менеджера сервісів, вам потрібно переконатися, що надіслати сигнал правильному процесу. Як це зробити, залежить від того, як саме починається демон і чим.
Це технічно можливо прикріпити процес , що протікає до терміналу, але є ризик , ви будете врізатися програмою, так що це безперечно поза для виробничої системи.
Цей -L
параметр змушує екран записувати у файл усе, що з’являється у його вікні. Ім'я файлу задається в daemon.screenrc
с logfile
директивою.