Eu quero ter um script "stop" personalizado runit
( runsv
) para executar quando precisar parar / reiniciar o processo. Atualmente, ele simplesmente mata o processo e, em seguida, executa o script "finish". Mas, no meu caso, meu processo gera processos filho dinamicamente; portanto, em vez de simples kill
, eu preciso "killtree"
me livrar deles. Como faço isso?
Eu sei que isso deve ser feito através das control
opções do runit, mas, ao ler os documentos, não está muito claro para mim como o script de parada deve ser nomeado :(
Respostas:
Dos documentos
Isso significa que você precisa criar um
service_name/control/X
X sendo um executável que será executado quando você enviar osv
comando relacionado ao serviço, como od
comando (inativo). Se o seu script sair com o status 0, ele não tentará desativar o próprio serviço.Basicamente, você precisa de um script executável
/etc/sv/<service>/control/d
que faça o que quiser e acabe com o serviço, limpe pids e etc.fonte
A resposta simples é nomear seu script de limpeza como "serviço / acabamento". Este script é executado quando "service / run" sai.
Também existe uma interface "service / control / ctrl_char. Permite executar ações diferentes, dependendo de qual comando você envia para runsv.
fonte
Eu mesmo tive que resolver esse problema no docker. Eu tinha o servidor uwsgi em execução e ele recebeu o sinal errado pelo docker (TERM em vez de INT) ao parar o contêiner.
A idéia dos arquivos control / x é reagir a um sinal recebido. No meu caso, eu colocaria um
t
arquivo para o sinal final sob controle, uma vez que é o arquivo reservado para o termo sinal. O script deve ser executável.O script envia um sinal int para o processo uwsgi, que é o que eu quero.
Se o script de controle estiver saindo sem erro (código de retorno 0), o sinal original não será enviado ao processo.
Portanto, no meu caso, eu pude receber o termo sinal e enviar um sinal int para o processo de serviço.
fonte