Есть довольно фундаментальная вещь о демонах, которых вы пропускаете: как правило, они не имеют управляющих терминалов. У них нет открытых файловых дескрипторов для терминальных устройств. Все, что ожидает общения с "терминалом", этого не сделает. Там нет "терминала".
Нет, $TERM
не указывает "терминал". Он определяет тип терминала, то есть, какие escape-последовательности отправлять как выходные данные и интерпретировать как входные. Это необходимо здесь, и вам нужно будет установить для него соответствующее значение. Но это не главный фактор здесь. Основным фактором является то, что нет "терминала".
Да, вывод заканчивается в /var/log/messages
. Стандартный вывод службы отправляется в журнал по умолчанию в systemd
, и вы, очевидно, запустили какой-то syslogd
. То, что вы видели это только после установки $TERM
просто означает, что ваш сценарий продвинулся дальше, пройдя ту часть, где ему нужно было знать тип терминала, чтобы понять, как он собирается выводить данные.
systemd
есть возможность подключать демонов к терминалам. Это должно иметь. Он запускает agetty
как демон для обеспечения сеансов входа в систему на виртуальных терминалах.
То, что вы ищете, - это параметры StandardInput=
, StandardOutput=
и TTYPath=
, чтобы добавить к этому файлу модуля в вашем вопросе. Загляните в /usr/lib/systemd/system/getty@.service
чтобы увидеть их в использовании.
Вы не даете достаточно информации в своем вопросе относительно того, является ли это правильным подходом, или вместо этого следует добавить ExecStartPre=
в пользовательский /etc/systemd/system/getty@.service
. Все зависит от того, нужно ли это запускать один раз перед запуском GUI или каждый раз перед каждым отдельным входом (TUI). Before=graphical.target
намекает на первое, но это может быть не то, что вы на самом деле хотели (учитывая RequiredBy=
). ☺