O upstart passa um corpo de script inteiro ao shell para execução ou processo linha por linha?

0

Meu trabalho inicial está falhando no pré-início, quando ele move qualquer arquivo de log anterior para um backup:

pre-start script
  mv -f $LOGDIR/$LOGFILE $LOGDIR/$LOGFILE.bak
  touch $LOGDIR/$LOGFILE
end script

Espero que o mv falhe se o arquivo de log anterior não existir, portanto, inclua o touch para garantir que o último comando no corpo do script retorne 0.

No entanto, se o script for executado quando não houver um arquivo de log anterior no diretório de log, ele falhará no pré-início:

Jan  9 17:21:14 ip-172-30-1-54 kernel: [  250.154908] init: myscript state changed from starting to security
Jan  9 17:21:14 ip-172-30-1-54 kernel: [  250.154951] init: myscript state changed from security to pre-start
Jan  9 17:21:14 ip-172-30-1-54 kernel: [  250.155652] init: myscript pre-start process (1425)
Jan  9 17:21:14 ip-172-30-1-54 kernel: [  250.157167] init: myscript pre-start process (1425) terminated with status 1
Jan  9 17:21:14 ip-172-30-1-54 kernel: [  250.157280] init: myscript goal changed from start to stop

Se eu iniciar o script novamente, ele passará pela pré-inicialização com êxito e entrará no corpo do script principal:

Jan  9 17:21:29 ip-172-30-1-54 kernel: [  265.444327] init: myscript state changed from starting to security
Jan  9 17:21:29 ip-172-30-1-54 kernel: [  265.444371] init: myscript state changed from security to pre-start
Jan  9 17:21:29 ip-172-30-1-54 kernel: [  265.445359] init: myscript pre-start process (1431)
Jan  9 17:21:29 ip-172-30-1-54 kernel: [  265.447203] init: myscript pre-start process (1431) exited normally
Jan  9 17:21:29 ip-172-30-1-54 kernel: [  265.447249] init: myscript state changed from pre-start to spawned
Jan  9 17:21:29 ip-172-30-1-54 kernel: [  265.447874] init: myscript main process (1434)
Jan  9 17:21:29 ip-172-30-1-54 kernel: [  265.447896] init: myscript state changed from spawned to post-start
Jan  9 17:21:29 ip-172-30-1-54 kernel: [  265.447972] init: myscript state changed from post-start to running

A partir desse comportamento, estou inferindo que o corpo do script é executado uma linha por vez, e qualquer falha termina o script (muito parecido com um make ). A documentação da diretiva script não fornece nenhuma orientação:

Allows the specification of a multi-line block of shell code to be executed. Block is terminated by end script.

Alguém pode confirmar ou negar minha crença? Se confirmado, posso simplesmente executar um script de shell independente com exec . Se for negado, preciso procurar outro lugar para o meu problema.

    
por kdgregory 09.01.2015 / 18:37

1 resposta

1

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 every script 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 .

    
por muru 10.01.2015 / 00:13