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.


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.


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.


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
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.