SystemD: configure o arquivo da unidade para que a tela de login não seja mostrada até que o serviço saia e reinicialize

2

Eu tenho um arquivo de unidade de serviço que instala e configura alguns aplicativos e precisa reinicializar o sistema quando ele sai. Estou migrando este script dos scripts sysVinit para systemD no centOS 7.1 e estou tendo problemas para fazer com que a tela de login do sistema aguarde até que o script seja concluído.

Eu tentei configurar como RequiredBy, WantedBy, antes, depois para sysinit.target, basic.target, network-online.target, mas todos eles não conseguem bloquear a tela de login até que a reinicialização seja concluída.

Alguém já lidou com isso antes ou sabe qual serviço controla a tela de login?

    
por user2946437 15.07.2015 / 00:14

2 respostas

2

Uma maneira de fazer isso é especificar que seu serviço é iniciado antes de outro serviço, usando Before= . Nesse caso, como não há GUI e você deseja impedir logins de console, você precisará usar [email protected] . (Observe, no entanto, que esse é um serviço parametrizado e, nesse caso, a parte após o @ representa a qual dispositivo executar getty on). Por exemplo:

[Unit]
Description=Run script to set up environment
[email protected] [email protected] [email protected] [email protected] [email protected] [email protected]

[Service]
Type=oneshot
ExecStart=/bin/myscript

Isso garantirá que o script seja executado antes de getty iniciar em TTY 1-6.

Como alternativa, você pode criar um arquivo (vazio) que dirá [email protected] não para inicializar. Isso tem a vantagem de adicionar automaticamente a condição a todas as instâncias de getty , e não apenas de 1 a 6.

Para fazer isso, primeiro crie o arquivo antes que seu serviço seja iniciado:

[Unit]
Description=Run script to set up environment

[Service]
Type=oneshot
ExecStartPre=/bin/touch /etc/no-login-console
ExecStart=/bin/myscript
ExecStopPost=/bin/rm /etc/no-login-console

Em seguida, execute systemctl edit [email protected] . Isso abrirá seu editor e criará um arquivo "override", que será efetivamente anexado ao arquivo de serviço principal. Dessa forma, você pode fazer suas próprias personalizações no serviço, mas ainda poderá usar as versões mais recentes do arquivo de serviço do CentOS. No editor que se abre, digite:

[Unit]
ConditionPathExists=!/etc/no-login-console

Isso informa ao serviço para iniciar somente se /etc/no-login-console não existir. Salve e saia do editor. Quando você executar systemctl cat [email protected] , deverá ver o arquivo de serviço principal, seguido por sua substituição.

Editar: parece que systemctl edit e systemctl cat não estão disponíveis na versão de systemd enviada no CentOS 7.1. Em vez disso, execute sudo vim /lib/systemd/system/[email protected]/condition-path.conf (onde /lib/systemd/system/[email protected] é o caminho para o arquivo de serviço) e inclua o texto acima no arquivo. Em seguida, execute systemctl daemon-reload seguido por systemctl status getty@ . A saída deve indicar que um arquivo drop-in foi lido.

    
por 16.07.2015 / 22:14
0

No Ubuntu 16.04 é o serviço display-manager . Por exemplo:

[Unit]
Description=Purge home
Before=display-manager.service

[Service]
Type=oneshot
ExecStart=/usr/local/sbin/clean-home.sh

[Install]
WantedBy=display-manager.service
    
por 14.11.2018 / 19:43

Tags