Você pode fazer dpkg
executar um comando antes ou depois das operações de gerenciamento de pacotes. Passe a opção --pre-invoke=COMMAND
ou --post-invoke=COMMAND
; o comando é executado com a variável de ambiente DPKG_HOOK_ACTION
definida para a natureza da ação. Isso não é muito conveniente porque esses ganchos são executados uma vez por dpkg
de invocação, não uma vez por pacote, e eles não fornecem uma maneira de dizer o que o processo dpkg
fará ou fez. Uma maneira indireta de descobrir o que aconteceu é registrar o estado do (s) pacote (s) em que você está interessado antes e depois da ação e invocar sua ação personalizada se o estado for alterado. Você também pode obter essas informações analisando os logs ( /var/log/dpkg.log
).
Uma solução mais específica seria conectar-se ao mecanismo padrão que o Debian fornece para o seu problema. O pacote nginx
(ou melhor, nginx-light
ou nginx-full
) chama invoke-rc.d nginx start
como parte de seu script de pós-instalação ( postinst
) e invoke-rc.d nginx stop
como parte de seu script de pré-remoção ( prerm
) . Substitua o comando invoke-rc.d
por um que seja personalizado para o runit e chame sv
; talvez você queira usar dpkg-divert
para isso:
dpkg-divert --add --rename --divert /usr/sbin/invoke-rc.d.sysvinit /usr/sbin/invoke-rc.d
ln -s invoke-rc.d.runit /usr/sbin/invoke-rc.d
Como alternativa, coloque sua própria cópia de invoke-rc.d
adaptada a sv
antes de /usr/sbin
no PATH, por exemplo em /usr/local/sbin
.
O script /usr/sbin/invoke-rc.d.runit
ou /usr/sbin/invoke-rc.d
deve cuidar da implementação do invoke-rc.d
interface :
- Ofereça suporte à sintaxe
invoke-rc.d SERVICE ACTION
em que ACTION é um dos start
, stop
, restart
, force-reload
, reload
.
- Suporta a opção
--quiet
(a única que eu vejo usada pelos scripts de manutenção de pacotes no meu sistema, eu não fiz uma busca exaustiva de todos os pacotes Debian).
- Invoque
/usr/sbin/policy-rc.d
conforme descrito na página do manual, se precisar (por exemplo, para evitar a execução de serviços em um chroot ou contêiner).
Se você quiser apenas gerenciar o Nginx com o runit, faça com que o invoke-rc.d
execute o padrão se o nome do serviço não for nginx
.
Considerando tudo, se você quiser apenas gerenciar o Nginx com o Runit, então desviar (ou mesmo editar - é um arquivo de configuração) /etc/init.d/nginx
parece ser a maneira mais fácil. Use o script existente como ponto de partida e substitua as chamadas para start-stop-daemon
pelas chamadas nv
apropriadas.