В настоящее время я запускаю консольную программу на экране, потому что мне нужно и читать, и время от времени отправлять команды.
Я хотел бы запустить приложение в качестве демона в фоновом режиме (запустить / остановить его с помощью init).
Я мог tail -f
бы записать в журнал, но это не позволит мне отправить входные данные в процесс.
Есть ли способ настроить это так, чтобы я мог как читать, так и отправлять ввод, но он все еще работает в фоновом режиме?
Я также хотел бы иметь возможность отправлять входные данные демону из разных процессов (например, сценарий оболочки, который может отправлять команду «Stop \ n»).
scripting
shell-script
tail
Билл К
источник
источник
Ответы:
Читай из трубы, пиши в файл
Если вы хотите, чтобы демон считывал ввод, произведенный каким-либо произвольным процессом, вам необходимо подключить этот процесс к каналу. Здесь произвольный процесс заключается в том, что вы повторяете команды, и он будет выполняться в другом контексте. Поэтому создайте именованный канал (часто называемый fifo в контексте unix).
И просто напишите команды в канал:
Однако это вряд ли будет работать как есть: есть большая вероятность, что демон выйдет, когда увидит конец файла на своем стандартном вводе, что произойдет, как только первый процесс, выполняющий запись в канал, завершится. Вы можете использовать,
tail -f
чтобы избежать этой проблемы.В некоторых
tail
реализациях вы можете быть укушены буферизацией:tail
процесс будет ждать, пока не соберет достаточно байтов для вывода некоторого результата. Я не думаю, что это разрешимо в наборе инструментов POSIX; если это проблема, используйте тривиальную программу на C, Perl или Python. Насколько я могу судить,tail
GNU coreutils (как в Linux и других местах) безопасен в этом отношении.Когда вы остановите демон,
echo >/var/run/daemon.fifo
убьетеtail
процесс.Запуск программы внутри экрана
Вместо того, чтобы вызывать демон прямо из вашего менеджера сервисов (вы действительно используете только SysV init или что-то дополнительное, например сценарии-обертки или Upstart?), Вызывайте
Поскольку демон не будет дочерним процессом диспетчера служб, необходимо обязательно отправить сигнал нужному процессу. Как это сделать, зависит от того, как именно запускается демон и чем.
Это технически возможно прикрепить процесс , протекающий к терминалу, но есть риск , вы будете врезаться программой, так что это определенно вне для производственной системы.
-L
Опция делает экран записи все , что появляется в окне в файл. Имя файла задается вdaemon.screenrc
сlogfile
директивой.источник
stuff
команду экрана ). Но вам не нужны служебные данные (обработка, но, что наиболее важно, когнитивное) терминала здесь, канала почти достаточно (этого достаточно с небольшим процессом ретрансляции, игнорирующим конец файла). Возможно, вы захотите немного поэкспериментировать с<fifo cat
или<fifo tail -f | cat
в одном терминале иecho >fifo; echo >fifo
в другом терминале; Я думаю, у тебя все будет хорошо.