в dæmons есть довольно фундаментальная вещь, которую вы пропускаете: как стандарт, у них нет управляющих терминалов. У них нет открытых дескрипторов файлов для терминальных устройств. Все, что ожидает разговора с "терминалом", этого не сделает. Нет никакого "терминала".
нет, $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=). ☺