LINUX.ORG.RU
решено ФорумAdmin

Вопрос по systemd

 ,


0

2

Всем привет. Есть такая проблема, необходимо при первой загрузке системы спрашивать пользователя hostname и менять его. Есть скрипт который отлично работал на Ubuntu до 16 версии так.

В файле rc.local: openvt -s -w /opt/script

В файле script: echo -n «Please enter new hostname: »

read NEW_HOSTNAME < /dev/tty

В Ubuntu 16 скрипт запускается, но не дожидаясь ответа от пользователя продолжает загрузку системы. Как я понял это из-за systemd который запускает службы параллельно(могу ошибаться). Подскажите, как быть в этой ситуации, 2 дня гугления, результата не дали.

Раз используется systemd, то его средствами и нужно решать задачу, например таким сервисом:

[Unit]
Description=Hostname configuration
DefaultDependencies=no
After=sysinit.target local-fs.target
Before=base.target
 
[Service]
Type=oneshot
ExecStart=$full_path/openvt -s -w /opt/script
 
[Install]
WantedBy=base.target

After, Before и WantedBy корректируй, если место запуска скрипта нужно другое.

arutemus ()
Ответ на: комментарий от CLaeR1984

Потому что в секцию [Service] надо добавить

StandardInput=tty
StandardOutput=tty
StandardError=tty

В systemd по умолчанию ввод/вывод сервисов (в том числе автогенерируемых в случае rc.local) связан с /dev/null

redgremlin ★★★★★ ()
Ответ на: комментарий от redgremlin

Нет, у топикастера используется openvt, которая запустит команду на первом свободном виртиальном терминале и в том числе перанаправит туда output/input/error. Вот если выкинуть openvt (лишняя сущность здесь), тогда да, нужно будет в сервисе указывать.

А по дефолту все перенаправляется не в dev/null, а в journal.

А не работает у топикастера скорей всего потому, что фраза:

After, Before и WantedBy корректируй, если место запуска скрипта нужно другое.

была проигнорирована. Например на centos/rh7 base в этом примере нужно поменять на basic. Ubuntu под рукой нету, там может по другому дефолтные таргеты называются.

arutemus ()
Ответ на: комментарий от redgremlin

Так тоже не показывает.

Единственный конфиг с которым он висит несколько секунд, но пока грузится система до экрана с логином.

------------------------------ rename.service

[Unit] Description=Hostname conf Before=getty@tty.service

[Service] Type=oneshot ExecStart=/opt/script

[Install] WantetBy=multi-user.target

--------------------------- script: !#/bin/bash echo «Its works» pwd=$(systemd-ask-password --echo)

CLaeR1984 ()

Ну, у тебя две ошибки. Первая — ты используешь openvt. Вторая — ты не включаешь юниту доступ к tty (StandardInput=tty/StandardOutput=tty/StandardError=tty). И зависимости расставь правильно, чтобы он запускался действительно первым.

alpha правильные вещи говорит. Даже если самого systemd-firstboot в твоём дистрибутиве нет, посмотри, как устроен systemd-firstboot (и его юнит), и сделай то же самое.

intelfx ★★★★★ ()
Последнее исправление: intelfx (всего исправлений: 1)
Ответ на: комментарий от redgremlin

В systemd по умолчанию ввод/вывод сервисов (в том числе автогенерируемых в случае rc.local) связан с /dev/null

Нет. С журналом ведь.

intelfx ★★★★★ ()

Всем спасибо, все получилось Сделал так:

[Unit]

Description=Hostname configuration 

DefaultDependencies=no

Before=nss-user-lookup.target

[Service]

Type=oneshot

ExecStart=/opt/script

[Install]

WantedBy=multi-user.target


!#/bin/bash 

echo «Its works» 

hostname=$(systemd-ask-password --echo)

CLaeR1984 ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.