Como depuro scripts Upstart?

67

Por alguma razão, estou recebendo um erro durante as atualizações do apport , cuja causa é

% sudo service apport start
start: Job failed to start

No sysvinit, eu poderia depurar esse tipo de problema executando, por exemplo,

sudo sh -x /etc/init.d/whatever start

mas isso não parece mapear para o Upstart. O que devo tentar a seguir?

Acontece que há uma solução alternativa que permitirá que a instalação continue. Mas ainda estou interessado na questão geral de como rastrear o script.

poolie
fonte
11
Estou trabalhando em uma resposta mais completa, mas obrigado pelo link para a solução alternativa, a mesma coisa aconteceu comigo atualizando o natty hoje!
21411 Mark Russell
Haha, e eles lançaram a correção 12 minutos atrás. A execução do Beta não é divertida? (sem realmente!)
Mark Russell
+ Muhammad postou a resposta correta abaixo.
Travis Reeder
Encontrei informações úteis sobre depuração em /var/log/syslog.
Matt

Respostas:

29

Todas as informações a seguir (e ajuda muito mais útil do Upstart) são do The Upstart Cookbook . Seção 18 aborda a depuração. http://upstart.ubuntu.com/cookbook/#debugging

Nesse caso específico de rastrear uma sub-rotina "script" de uma tarefa inicial, você deve adicionar as seguintes linhas logo abaixo da palavra "script":

exec 2>>/dev/.initramfs/myjob.log
set -x

A razão para a localização ímpar é que /dev/.initramfs/ está disponível na inicialização muito cedo, antes do carregamento do sistema de arquivos raiz e continua disponível após a inicialização. No entanto, acho que com o apport, você provavelmente não precisa usar esse caminho. Ainda assim, é bom saber a opção.

Também deve ser observado que todos os scripts são executados com set -equalquer comando que falhe sairá completamente do script. O que faz sentido, pois é preciso ter muito cuidado ao executar scripts como root.

Eu recomendo consultar o Livro de receitas Upstart vinculado acima em geral para quem trabalha com trabalhos Upstart.

Mark Russell
fonte
Obrigado por isso, se eu não tivesse visto o bug foi resolvido, provavelmente teria modificado o script para ativar set -xcomo você sugere. Eu estava pensando principalmente se havia alguma maneira mais limpa de fazer isso.
poolieby
Sim, não que eu saiba (e se não estiver no livro de receitas, significa que provavelmente não existe). Além dessa ideia, a maioria das técnicas de depuração mencionadas são mais sobre a solução de problemas dos eventos Upstart e Upstart, que é onde eu geralmente me encontro. :)
Mark Russell
E, no entanto este método irá falhar se setuide setgidsão utilizados em postos de trabalho.
0xC0000022L
/dev/.initramfs nem sempre está presente. Acabei de encontrar uma máquina que não tem esse caminho.
Sarge Borsch
110

O Upstart registra a execução do serviço em um arquivo de log com o mesmo nome em /var/log/upstart/your-service-name.log. Deve ser útil.

Muhammad Gelbana
fonte
2
Certo, parece que isso inclui o stderr dos trabalhos, portanto, se eu ligasse set -x, provavelmente apareceria lá.
poolie
11
Coloquei uma declaração de log baseada em eco no meu script /etc/init.d/Xservice, mas ele não aparece nesse local! OS: Ubuntu 14.04 Trusty
Champ
Por que não syslog? Posso sugerir um recurso geral, talvez o próprio rsyslog, que o iniciante e qualquer componente usaria para gravar no syslog, se não estiver disponível, ou em um local temporário que seria transferido para o syslog o mais rápido possível. Levei meio dia para encontrar isso. Por favor, envie esta observação TIA.
Papou
4
Isso parece não ser mais verdadeiro no 16.04, aparentemente desde 15.10, pelo menos: os últimos arquivos nesse diretório são datados um pouco antes do lançamento do 15.10.
FGM
11
@FGM, isso ocorre porque o 16.04 não usa mais o upstart, ele usa o systemd. Os logs são acessados ​​comjournalctl
Jeremy