6

Я пытаюсь запустить небольшой интерактивный скрипт конфигурации из 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. Но я бы ожидал, что скрипт будет запущен на первом виртуальном терминале.

Любые предложения или идеи будут с благодарностью.

1 ответ1

1

Есть довольно фундаментальная вещь о демонах, которых вы пропускаете: как правило, они не имеют управляющих терминалов. У них нет открытых файловых дескрипторов для терминальных устройств. Все, что ожидает общения с "терминалом", этого не сделает. Там нет "терминала".

Нет, $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=). ☺

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .