Использование systemd для выполнения интерактивного сценария (whiptail) после многопользовательского.цель, но до экрана входа в систему

Я пытаюсь запустить небольшой интерактивный скрипт конфигурации из systemd на Fedora 19. Это должно быть выполнено как root и выполнено до входа пользователя в систему. Я создал сервис, который выглядит примерно так:

[Unit]
Description=blah
Before=graphical.target 

[Service]
Type=oneshot
ExecStart=/path/to/script.sh

[Install]
RequiredBy=multi-user.target

и для простоты, скрипт выглядит так:

#!/bin/sh
whiptail --msgbox "test" 0 78

но когда я загружаю эту службу и перезагружаю, вывод скрипта не отображается, и в /var/log/messages он предлагает установить переменную TERM. Но я бы ожидалось, что сценарий будет выполняться на первом виртуальном терминале.

любые предложения или понимание были бы весьма признательны.

5
задан pxul
источник

1 ответов

в 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=). ☺

0
отвечен JdeBP 2013-12-19 23:36:15
источник

Другие вопросы bash linux systemd