Fiquei com a impressão de que o Upstart executava o script como um todo usando /bin/sh
, com saída no erro ( set -e
, ou a opção de linha de comando -e
). Ou seja, se algum comando cujo código de saída não estiver marcado retornar um código de saída diferente de zero, encerre o script imediatamente.
De fato, dada uma configuração:
description "Testing upstart"
task
script
set -o > /tmp/blah
end script
Encontramos as seguintes opções:
Current option settings
errexit on
noglob off
ignoreeof off
interactive off
monitor off
noexec off
stdin off
xtrace off
verbose off
vi off
emacs off
noclobber off
allexport off
notify off
nounset off
nolog off
debug off
Embora eu esteja intrigado sobre como ele foi executado pela segunda vez, desde então, para qualquer configuração do formulário:
pre-start script
false
# any number of commands
end script
Nenhum dos comandos após false
foi executado, como esperado, portanto o comando touch
nunca deve ter sido executado e o mv
deve ter falhado em execuções subseqüentes também.
set -e
não é incomum - você verá que, por exemplo, os scripts de manutenção de pacote também são executados com ele ativado. É por isso que você veria clichê do formulário:
command that could fail but is not essential || true
De fato, o Cookbook diz isso também :
If a
script
section appears to be behaving in an odd fashion, the chances are that one of the commands is failing. Remember that Upstart runs everyscript
section using/bin/sh -e
. This means that if any simple command fails, the shell will exit.
Veja também: Seções 11.58.1 e 18.7 .