Como o Ubuntu conta com o upstart já há algum tempo, eu gostaria de usar um trabalho inicial para encerrar normalmente certos aplicativos no desligamento ou reinicialização do sistema. É essencial que o desligamento ou reinicialização do sistema seja interrompido até que esses aplicativos sejam desligados.
Os aplicativos serão iniciados manualmente ocasionalmente e o desligamento do sistema deve ser encerrado automaticamente por um script (que eu já tenho). Como os aplicativos não podem ser finalizados de maneira confiável sem (quase todos) outros serviços em execução, o término dos aplicativos deve ser feito antes que o restante do desligamento comece.
Penso que posso resolver isso através de um trabalho inicial que será acionado no encerramento, mas não tenho certeza de quais eventos devo usar de que maneira. Até agora, li as seguintes declarações (parcialmente contraditórias):
- Não há evento de desligamento geral no iniciante
- Use uma estrofe como
start on starting shutdown
na definição de tarefa - Use uma estrofe como
start on runlevel [06S]
na definição de tarefa - Use uma estrofe como
start on starting runlevel [06S]
na definição de tarefa - Use uma estrofe como
start on stopping runlevel [!06S]
na definição de tarefa
A partir dessas recomendações, surgem as seguintes perguntas:
- Existe ou não um evento de desligamento geral no inicio do Ubuntu?
- Qual é a maneira recomendada de implementar um "gancho de desligamento"?
- Quando os eventos no nível de execução [x] são acionados; é isso ao entrar no nível de execução ou ao entrar no nível de execução?
- Podemos usar algo como
start on starting runlevel [x]
oustart on stopping runlevel [x]
? - Qual seria a melhor solução para o meu problema?
Muito obrigado
startup
evento distinto é que algo é necessário para "escorvar a bomba". Depois que um evento privilegiado é enviado, tudo o mais pode ser e é definido pelos trabalhos e tarefas acionados porstartup
. Quanto a não haver um únicoshutdown
evento, existem muitos tipos diferentesshutdown
para que isso seja significativo. É melhor depender diretamente dos trabalhos que você precisa executar.on stopping servicea or stoping serviceb or ...
para os serviços que você precisa executar.Para impedir que o desligamento continue enquanto seu trabalho é interrompido, você deve usar o seguinte:
Isso funcionará porque a primeira coisa que acontece quando você digita 'shutdown' é o nível de tunel 0 é emitido. rc inicia no nível de execução, e a transição de parado -> inicial será completamente bloqueada até que quaisquer tarefas que também devem mudar de estado concluam esse estado.
Você deseja garantir que seu processo responda rapidamente ao SIGTERM. Se não responder dentro de 5 segundos, o iniciante enviará o SIGKILL. Você pode aumentar isso com 'kill timeout X'.
O 1 ali, btw, é um pouco complicado, você precisa ter certeza de que o início inclui algo que inicie no nível de execução [2345] nesse ponto, para que um usuário que esteja inativo para manutenção no modo de usuário único inicie seu trabalho novamente. Felizmente, muito trabalho foi feito para tornar este o início usual sugerido em
Também em alguns casos, você precisa de algo para continuar funcionando até a rede ser desativada (como dbus / network-manager). Para isso você quer
Esse é um evento emitido posteriormente no encerramento que também será bloqueado até que quaisquer tarefas que o usem concluam completamente suas transições no estado.
fonte
start on starting ...
Não faz muito sentido ter meu gancho de desligamento parado em nada.start on starting rc RUNLEVEL=[016]
faria muito mais sentido. E talvez umatask
jogada lá para garantir que ela possa ser concluída antes que outras coisas funcionem.Geekosaur, muito obrigado pela sua ajuda.
Enquanto isso, tentei o
start on runlevel [016]
método, mas não funcionou e acho que entendo o porquê:O trabalho foi realmente iniciado, mas o processo de desligamento não foi bloqueado até a conclusão da tarefa. Estou certo agora que os eventos
starting
estopping
os únicos que podem ser usados em uma definição de trabalho para bloquear outros trabalhos, e acho que é isso que os manuais da Upstart tentam nos dizer. Portanto, o uso do evento runlevel nunca levará ao bloqueio de outros trabalhos ou ao processo de desligamento; assim, é inútil para o meu propósito.Em vez disso, pareço ter duas possibilidades:
Seguindo uma de suas proposições, descubra todos os trabalhos de que os aplicativos respectivos precisam e inclua todos eles no evento start para o script assim:
É tanto trabalho que estou pensando seriamente em descartar a lista de tarefas e executá-la no sed para produzir automaticamente uma estrofe de início para o meu trabalho, que inclui todos os trabalhos que normalmente estão em execução no sistema.
A vantagem seria que os respectivos aplicativos seriam encerrados mesmo quando alguém parasse um dos pré-requisitos manualmente (em vez de interrompê-los por uma alteração / desligamento / reinicialização do nível de execução).
Encontre o único trabalho que será parado primeiro ao reiniciar / desligar o sistema (vamos chamar esse trabalho de "FirstJob") e use esse trabalho em uma estrofe como:
As principais desvantagens seriam que eu não sei se esse trabalho existe e se esse trabalho realmente depende de todos os outros trabalhos dos quais o aplicativo em questão realmente depende ("depende de outro trabalho", nesse caso, significa "será interrompido" completamente antes que outro trabalho comece a parar ").
Não tenho certeza de qual das duas possibilidades é a melhor ...
fonte
sed
roteiro agora, se estivesse no seu lugar.