o serviço init falha ao ativar uma vez que um arquivo de serviço systemd é gerado

2

Estou resolvendo um problema com um serviço sysVinit que não fica on-line corretamente durante a inicialização em um ambiente systemd. O que eu descobri é que quando nenhum arquivo de serviço ou sobreposições estão presentes em / etc / systemd / system / para o serviço mencionado, ele é iniciado automaticamente. Neste caso, pelo que entendi, o systemd deve estar carregando dinamicamente o script de inicialização por meio da leitura dos scripts sysvinit "legados" presentes no sistema, embora eu não esteja 100% claro sobre isso.

O que me atrapalha é que assim que eu passo a opção edit --full para systemctl para o serviço mencionado, um arquivo simples é gerado em / etc / systemd / system / e o serviço agora falha ao iniciar automaticamente na inicialização . Usar a opção de edição e tentar adicionar quaisquer substituições também parece fazer com que o serviço não inicialize.

Exemplos, se necessários, fornecidos abaixo ...

Exemplo do sistema quando funciona:

O serviço, neste exemplo chamado "ProgramExample", tem um script de inicialização colocado em /etc/init.d/programexample e também em /etc/rc.d/init.d/programexample:

[root@centos7-box ~]# ls -l /etc/rc.d/init.d/programexample
-rwxr-xr-x. 1 root root 2264 Mar 29 14:11 /etc/rc.d/init.d/programexample

Nenhum arquivo de serviço está presente em / etc / systemd / system /:

[root@centos7-box ~]# ls -lh /etc/systemd/system/programexample.service
ls: cannot access /etc/systemd/system/programexample.service: No such file or directory

Saída de status do Systemctl nessa configuração:

[root@centos7-box ~]# systemctl status programexample.service
● programexample.service - LSB: Start Program Example at boot time
   Loaded: loaded (/etc/rc.d/init.d/programexample; bad; vendor preset: disabled)
   Active: active (exited) since Wed 2017-03-29 15:53:06 CDT; 14min ago
     Docs: man:systemd-sysv-generator(8)
  Process: 1297 ExecStart=/etc/rc.d/init.d/programexample start (code=exited, status=0/SUCCESS)

Mar 29 15:53:05 centos7-box systemd[1]: Starting LSB: Start ProgramExample at boot time...
Mar 29 15:53:05 centos7-box su[1307]: (to programexample) root on none
Mar 29 15:53:06 centos7-box programexample[1297]: ProgramExample (user programexample): instance name set to centos7-box
Mar 29 15:53:06 centos7-box programexample[1297]: instance public base uri set to https://192.168.0.148.programexample.net/programexample/
Mar 29 15:53:06 centos7-box programexample[1297]: instance timezone set to US/Central
Mar 29 15:53:06 centos7-box programexample[1297]: starting java services
Mar 29 15:53:06 centos7-box programexample[1297]: ProgEx server started.
Mar 29 15:53:06 centos7-box systemd[1]: Started LSB: Start ProgramExample at boot time.

Com a configuração acima, sem nenhum arquivo criado / colocado em / etc / systemd / system /, o serviço ProgramExample é iniciado automaticamente.

Uma vez que systemctl edit --full (ou apenas edit) é usado:

Após as edições serem passadas para o systemctl, observei o seguinte:

  • Um arquivo simples ou um diretório de substituição será colocado em / etc / systemd / system /
  • Esse serviço, neste caso, ProgramExample, falha ao iniciar na inicialização.
  • Não será possível "ativar" o referido serviço usando systemctl

Saída de status do Systemctl nessa configuração (pós-edição):

[root@centos7-box ~]# systemctl status programexample.service
● programexample.service - LSB: Start ProgramExample at boot time
   Loaded: loaded (/etc/rc.d/init.d/programexample; static; vendor preset: disabled)
   Active: inactive (dead)
     Docs: man:systemd-sysv-generator(8)

Este é o arquivo de serviço que está sendo gerado e colocado em / etc / systemd / system / ao usar a opção -edit --full:

# Automatically generated by systemd-sysv-generator

[Unit]
Documentation=man:systemd-sysv-generator(8)
SourcePath=/etc/rc.d/init.d/programexample
Description=LSB: Start ProgramExample at boot time
Before=runlevel2.target
Before=runlevel3.target
Before=runlevel4.target
Before=runlevel5.target
Before=shutdown.target
Before=adsm.service
After=all.target
After=network-online.target
After=postgresql-9.4.service
Conflicts=shutdown.target

[Service]
Type=forking
Restart=no
TimeoutSec=5min
IgnoreSIGPIPE=no
KillMode=process
GuessMainPID=no
RemainAfterExit=yes
ExecStart=/etc/rc.d/init.d/programexample start
ExecStop=/etc/rc.d/init.d/programexample stop
ExecReload=/etc/rc.d/init.d/programexample reload

O que está acontecendo aqui? Estou correto que, sem o diretório de serviço plano e / ou de substituição de serviços, em / etc / systemd / system / que o systemd esteja lendo dinamicamente essas informações a partir do script de inicialização do serviço? Eu tentei várias iterações de editar o arquivo de serviço em / etc / systemd / system / e deixar o arquivo padrão no lugar e não conseguir que o início automático funcione ou que o serviço entre em um estado "habilitado".

Acredito que seria preferível ter um arquivo systemd .service para configurações systemd em vez de depender do systemd para ler os cabeçalhos LSB do script de inicialização por motivos de compatibilidade e simultaneidade, mas o arquivo padrão que o systemd está criando não está sendo iniciado ou ativado com inúmeras outras iterações mais simples do arquivo .service que eu tentei.

    
por Toby 29.03.2017 / 23:40

1 resposta

2

Descobri agora que o problema era que o arquivo de serviço gerado automaticamente pelo systemd-sysv-generator não tinha uma seção de instalação com uma opção WantedBy. Eu adicionei o seguinte ao meu arquivo gerado em /etc/systemd/system/programexample.service que me permitiu habilitar corretamente o serviço:

[Install]
WantedBy = multi-user.target

Depois disso eu corri

systemctl daemon-reload

para garantir que meu arquivo de serviço foi lido pelo systemd.

Agora recebi uma notificação correta de que meu serviço estava realmente vinculado em algum lugar para ser "ativado":

[root@centos7-box ~]# systemctl enable programexample.service
Created symlink from /etc/systemd/system/multi-user.target.wants/programexample.service to /etc/systemd/system/programexample.service.

Este link me ajudou a entender melhor o arquivo de serviço.

Eu não sou fã da maneira como o systemd-sysv-generator não inclui uma seção de instalação com uma opção WantedBy por padrão. Se o systemd puder ler dinamicamente os cabeçalhos do LSB e iniciar corretamente os serviços na inicialização, por que ele não gera o arquivo de serviço adequadamente? Suponho que algumas dores de crescimento sistêmico são esperadas.

    
por 30.03.2017 / 04:05