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.