Читай из трубы, пиши в файл
Если вы хотите, чтобы демон считывал ввод, произведенный каким-либо произвольным процессом, вам необходимо подключить этот процесс к каналу. Здесь произвольный процесс заключается в том, что вы повторяете команды, и он будет выполняться в другом контексте. Поэтому создайте именованный канал (часто называемый fifo в контексте 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
директивой.