Usando o systemd para executar um script interativo (whiptail) após o multi-user.target, mas antes da tela de login

5

Estou tentando executar um pequeno script de configuração interativa do systemd no Fedora 19. Ele precisa ser executado como root e executado antes do login do usuário. Eu criei um serviço que se parece um pouco com isto:

[Unit]
Description=blah
Before=graphical.target 

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

[Install]
RequiredBy=multi-user.target

e, por simplicidade, o script é assim:

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

Mas quando eu carrego este serviço e reinicializo a saída do script não é exibida e em / var / log / messages ele sugere que a variável TERM deve ser configurada. Mas eu esperava que o script fosse executado no primeiro terminal virtual.

Qualquer sugestão ou insight seria muito apreciada.

    
por pxul 17.12.2013 / 19:16

1 resposta

0

Há uma coisa bastante fundamental sobre os daemons que você está perdendo: como padrão, eles não têm terminais de controle. Eles não têm identificadores de arquivo aberto para dispositivos de terminal. Qualquer coisa que espere falar com "o terminal" não o fará. Não há "o terminal".

Não, $TERM não especifica "o terminal". Ele especifica o terminal tipo , ou seja, quais seqüências de escape enviar como saída e interpretar como entrada. É necessário aqui, e você terá que providenciar para que seja ajustado para um valor apropriado. Mas não é o principal fator aqui. O principal fator é que não há "o terminal".

Sim, a saída acaba em /var/log/messages . A saída padrão de um serviço vai para o diário por padrão em systemd , e você evidentemente tem um syslogd de algum tipo em execução. O fato de você ver isso somente depois que $TERM foi definido significa simplesmente que seu script foi mais avançado, além da parte em que precisou conhecer o tipo de terminal para descobrir como ele produziria as coisas.

systemd tem a capacidade de conectar daemons aos terminais. Tem que ter. Ele executa agetty como um daemon para fornecer as sessões de login em terminais virtuais.

O que você está procurando são os StandardInput= , StandardOutput= e TTYPath= configurações, para adicionar ao arquivo de unidade em sua pergunta. Dê uma olhada em /usr/lib/systemd/system/[email protected] para vê-los em uso.

Você não dá informações suficientes em sua pergunta se esta é precisamente a abordagem correta, ou se você deveria estar adicionando um ExecStartPre= para um /etc/systemd/system/[email protected] personalizado. Tudo depende se isso é algo para ser executado uma vez antes de iniciar uma GUI, ou sempre antes de cada login individual (TUI). Before=graphical.target sugere o antigo, mas isso pode não ser o que você realmente queria (dado o RequiredBy= ). ☺

    
por 20.12.2013 / 00:36