Qual é o caminho certo para reiniciar os serviços dependentes durante a instalação do pacote?

9

Estou criando um pacote de configuração e gostaria de interromper e reiniciar serviços cuja configuração foi afetada. No momento, estou usando o service [stop|restart] in {pre,post}{inst,rm} way. Eu li em uma pergunta em algum lugar que invoke-rc.d é o caminho correto , porque ele respeita as preferências do usuário sobre um serviço. No entanto, não consegui encontrar nenhuma orientação sobre isso. Alguém sabe de tais diretrizes? Ou tem algum conselho sobre o caminho que eu deveria escolher? O pacote é de uso interno e provavelmente será apenas para 14.04 nos próximos dois anos. No entanto, gostaria de deixar o estado mais limpo possível para o meu sucessor, por isso systemd também está na minha mente.

Na invoke-rc.d man page :

All access to the init scripts by Debian packages' maintainer scripts should be done through invoke-rc.d.

Do Manual de Políticas Debian, Capítulo 9, Seção 3.3 :

Maintainers should use the abstraction layer provided by the update-rc.d and invoke-rc.d programs to deal with initscripts in their packages' scripts such as postinst, prerm and postrm.

...

The package maintainer scripts must use invoke-rc.d to invoke the /etc/init.d/* initscripts, instead of calling them directly.

O Debian tem usado sysv-init e irá mudar diretamente para systemd , e eu suponho que o manual de políticas será atualizado no devido tempo para se referir a systemctl . No entanto, estou incerto sobre isso: devo usar invoke-rc.d em vez de service ? Eu posso dizer a dpkg que estou interessado em alguns arquivos (via triggers), então existe uma maneira de dizer a dpkg que estou interessado em alguns serviços também e recebo dpkg para reiniciar / recarregar? / p>

Para esclarecer: eu não escrevo scripts de inicialização. Estou fornecendo um pacote com configuração para outros aplicativos, como Puppet, NTP, etc., então paro e reinicio os serviços correspondentes nos scripts.

Aqui , por exemplo, é um problema do Docker sobre invoke-rc.d vs service . A questão ainda está em aberto, com uma pessoa, provavelmente uma mantenedora, comentando que eles estão definitivamente interessados em fazer isso do modo correto - claramente nenhum de nós tem certeza do que é isso. (Minha pergunta é independente desse problema.)

    
por muru 07.07.2014 / 21:27

2 respostas

5

Eu continuaria usando os scripts pré / pós-inst,

preinst - This script executes before that package will be unpacked from its Debian archive (".deb") file. Many 'preinst' scripts stop services for packages which are being upgraded until their installation or upgrade is completed (following the successful execution of the 'postinst' script).

postinst - This script typically completes any required configuration of the package foo once foo has been unpacked from its Debian archive (".deb") file. Often, 'postinst' scripts ask the user for input, and/or warn the user that if he accepts default values, he should remember to go back and re-configure that package as the situation warrants. Many 'postinst' scripts then execute any commands necessary to start or restart a service once a new package has been installed or upgraded.

veja - link

A sintaxe de invocação start | stop | restart é escrita como condicional, veja link seção 9.3.3.2 Executando initscripts

if which invoke-rc.d >/dev/null 2>&1; then

invoke-rc.d package

else

/etc/init.d/package

fi

então ...

if which service >/dev/null 2>&1; then
        service package <action>
elif which invoke-rc.d >/dev/null 2>&1; then
        invoke-rc.d package <action>
else
        /etc/init.d/package <action>
fi

e adicione outro condicional para o systemd quando necessário;)

Então, sim, a maneira correta de iniciar | stop | restart um serviço é com o script wrapper apropriado (invoke-rc.d / system), quando possível, em vez de chamar o script init (/etc/init.d/ pacote) e voltar ao script /etc/init.d quando nenhum wrapper estiver disponível.

    
por Panther 07.07.2014 / 22:06
0

Uma maneira melhor para sistemas systemd é usar deb-systemd-invoke .

    
por Razvan Grigore 21.09.2017 / 12:39