Como funciona o trabalho rc / ordem de (contradizendo) estrofes “comece em…” e “pare em…”

3

Eu não consigo entender como funciona a definição de tarefa rc do Upstart no Natty 11.04. Para ilustrar o problema, aqui está a definição (as linhas vazias e os comentários são omitidos):

start on runlevel [0123456]
stop on runlevel [!$RUNLEVEL]
export RUNLEVEL
export PREVLEVEL
console output
env INIT_VERBOSE
task
exec /etc/init.d/rc $RUNLEVEL
Vamos supor que atualmente estamos no nível de execução 2 e o trabalho rc está parado (é exatamente essa a situação depois de inicializar minha caixa e fazer o login via SSH). Agora, vamos supor que o sistema alterna para o nível de execução 3, por exemplo, devido a um comando como "telinit 3" fornecido pelo root. O que acontecerá com o trabalho de rc?

Obviamente, o trabalho rc será iniciado já que está parado no momento e o nível de execução 3 do evento está correspondendo aos eventos iniciais. Mas de agora em diante, as coisas não estão claras para mim: De acordo com o manual $ RUNLEVEL avalia o novo runlevel quando o job é iniciado (isso significa 3 no nosso exemplo).

Portanto, a próxima estrofe "stop on runlevel [! $ RUNLEVEL]" significa "stop on runlevel [! 3]"; Isso significa que temos uma primeira estrofe que irá desencadear o trabalho, mas a segunda estrofe nunca vai parar o trabalho e parece ser inútil.

Desde que eu sei que o pessoal do Ubuntu / Upstart não vai fazer coisas inúteis, eu devo estar entendendo mal alguma coisa. Eu ficaria grato por qualquer explicação.

Enquanto tentava entender isso, uma pergunta adicional veio à minha mente. Se eu tivesse contraditório iniciar e parar gatilhos, por exemplo

start on foo
stop on foo

o que aconteceria? Eu juro que nunca farei isso, mas estou muito interessado em como Upstart lida com isso no nível teórico.

Muito obrigado!

Editando a pergunta como uma reação na primeira resposta do geekosaur:

Eu posso ver o paralelismo, mas não é assim tão fácil (pelo menos não para mim).

Vamos supor que o trabalho ainda esteja em execução, e um novo evento runlevel entre (é claro, o novo runlevel é diferente do atual). Então, o seguinte deve acontecer:

1) O trabalho é uma instância única. Isso significa que "começar em ..." não será acionado porque o trabalho está em execução no momento; $ RUNLEVEL não é tocado.

2) "stop on ..." será acionado já que o novo runlevel é diferente de $ RUNLEVEL, então o job será abortado.

3) Agora, o trabalho está parado e esperando. Não consigo ver como é reiniciado com o novo runlevel. AFAIK, o initctl emite eventos apenas uma vez, então "iniciar em ..." não será acionado e o novo nível de execução não será inserido.

Eu sei que ainda estou entendendo mal alguma coisa, e agradeço pelas explicações.

Muito obrigado!

    
por Binarus 16.03.2011 / 23:28

4 respostas

3

A ordem das operações é mantida com muito cuidado na inicialização ao processar eventos. Paradas causadas por um evento são sempre feitas antes de serem iniciadas. Enquanto o linux é multi-processo, o mecanismo de evento do upstart não é.

Assim, o comando runlevel, que emite o evento 'runlevel', é recebido pelo mecanismo de estado upstart e, em seguida, processado fazendo primeiro todas as transições do início ao fim completamente. Isso irá bloquear até que o primeiro rc seja morto e morto. Em seguida, as transições de parar para iniciar são concluídas e o novo trabalho rc é iniciado.

Isso está documentado no código fonte do upstart:

    /* We stop first so that if an event is listed both as a
     * stop and start event, it causes an active running process
     * to be killed, the stop script then the start script to be
     * run.  In any other state, it has no special effect.
     *
     * (The other way around would be just strange, it'd cause
     * a process's start and stop scripts to be run without the
     * actual process).
     */

Isso provavelmente pertence ao livro de receitas inicial , então eu abri um bug de wishlist aqui:

link

    
por SpamapS 29.03.2011 / 19:04
3

Agora documentamos (esperamos) claramente como o trabalho "rc" funciona no Ubuntu no Cookbook Upstart. Ele ainda tem sua própria seção:

link

No entanto, para o contexto completo, sugiro que você leia aqui:

link

    
por jamesodhunt 31.03.2011 / 21:24
3

O restante da sua pergunta agora deve ser respondido pelas seguintes seções no Cookbook do Upstart:

por jamesodhunt 07.04.2011 / 18:35
1

Você viu minha resposta para Sense de "parar em ..." estrofe quando o trabalho é uma tarefa ? A mesma resposta se aplica à primeira parte da sua pergunta, é usada para abortar a inicialização do nível de execução se o usuário alternar para outro nível de execução antes de terminar.

Eu não tenho ideia sobre a segunda parte, no entanto.

    
por geekosaur 16.03.2011 / 23:35