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!