Por que meu serviço iniciante não está iniciando na inicialização do sistema?

37

Na sequência de esta questão , escrevi um simples serviço upstart ( /etc/init/pms.conf ) para minha caixa do Ubuntu Server 11.04 sem cabeçalho como segue:

start on filesystem and net-device-up IFACE=eth0
stop on runlevel [016]
respawn

exec /home/administrator/pms-current/PMS.sh

Eu posso iniciar (ou parar) este serviço à vontade a partir da linha de comando:

service pms start

E eu posso ver que está realmente funcionando.

No entanto, quando inicializo minha máquina pela primeira vez, o serviço não é iniciado. Se eu SSH na caixa e verificar o status do serviço eu recebo:

$ service pms status
pms stop/waiting

Minha pergunta é por que isso está acontecendo? Por que meu serviço não está sendo iniciado na inicialização?

UPDATE 1 : não tenho certeza se meu serviço estava sendo iniciado e, posteriormente, morrendo ou simplesmente não estava sendo iniciado, adicionei o seguinte ao PMS.sh:

echo "STARTED" > $STARTLOG

Isso obviamente me dá algo para procurar. Eu testei isso iniciando o serviço sozinho e, em seguida, verificando start.log . Em seguida, apaguei o start.log e reiniciei. Ele não estava lá após o reinício, então parece que o novato definitivamente não está iniciando meu serviço. Eu suponho que poderia estar morrendo em um ponto anterior no processo, mas isso parece bastante improvável, dada a simplicidade de tudo isso.

UPDATE 2 : Acabei de atualizar para o 11.10, que inclui uma atualização inicial, mas esse problema ainda ocorre.

UPDATE 3 : conforme solicitado, inicializei com --debug . A saída de cat /var/log/syslog | grep init é muito longa para colocar na questão, mas você a vê aqui .

UPDATE 4 : Mais registros, desta vez o conf upstart está incluído no topo. Execute 1 e execute 2 .

    
por Kent Boogaart 24.09.2011 / 14:23

12 respostas

19

Eu recomendaria aumentar a verbosidade do trabalho, por exemplo usando entradas de pré-início / pós-início.

pre-start script
  logger "pre-start for myprog"
end script

post-start script
  logger "post-start for myprog"
end script

# and for PMS itself:
script
  logger "just before executing PMS"
  exec /home/administrator/pms-current/PMS.sh
end script

Mais informações no link

Veja também o link

    
por Clausi 24.10.2011 / 14:13
14

O que provavelmente está acontecendo aqui é que o pms esteja iniciando antes de seus adaptadores de rede aparecerem, e provavelmente antes mesmo do adaptador de loopback (lo). Supondo que estamos falando sobre o PS3 Media Server, é um serviço de rede e provavelmente não gosta de iniciar sem interfaces disponíveis.

Tente alterar seus critérios de início para:

start on filesystem and net-device-up IFACE!=lo

Significado, inicie depois que qualquer interface de rede "real" estiver ativa. No entanto, isso pode não ser o ideal, se eth0 for a próxima interface, o PMS iniciará, mas você realmente quer que o PMS use o wlan0, isso não funcionará. O serviço será iniciado, mas talvez não tenha sido possível escolher a interface que você queria que ele ouvisse. Supondo que você saiba que a interface será transmitida e não será alterada, codifico-a no trabalho, por exemplo:

start on filesystem and net-device-up IFACE=wlan0

Em Oneiric (11.10), você pode usar o evento static-network-up para aguardar todos os dispositivos configurados estaticamente. O que é legal porque permite que você escreva tarefas dependentes de rede sem codificar uma interface. [Nota: por "todos os dispositivos estaticamente configurados", estou me referindo ao uso de /etc/network/interfaces em vez do NetworkManager. Isso não significa estático no sentido de IP estático versus DHCP.]

    
por Mark Russell 24.09.2011 / 17:58
3

A partir do exame do seu syslog, o processo pms começa sem erros, mas depois de um tempo seu objetivo é alterado de início para parada, significando que é eliminado.

Isso é um pouco estranho porque você adicionou a cláusula repsawn, por isso deve tentar iniciar novamente depois que ela for interrompida, mas isso nunca acontecerá. Então, estou supondo que você removeu a cláusula de reaparecimento.

Entre o serviço pms iniciando e parando apenas 2 serviços são iniciados ufw e network-interface (eth0), e 1 é iniciado udev-fallback-graphics.

Parece que você processa o pms sendo iniciado em paralelo. Infelizmente, a documentação recente está um pouco confusa sobre as diferenças exatas entre start on ... vanilla e start on starting ... e start on started ... .

Tente alterar sua estrofe de inicialização para

start on started networking

ou simplesmente

start on net-device-up IFACE=eth0

A saída do log é um pouco estranha, já que o evento net-device-up vem muito mais tarde, mas o pms é iniciado antes dele.

Isso deve garantir que o processo seja iniciado apenas quando a configuração da rede all estiver concluída, ou seja, a tarefa não apenas começou, mas terminou.

Também não confie na saída do log completamente, no início da saída do log do processo de inicialização para qualquer arquivo nem sempre funciona. Veja a resposta em Debugging Upstart

    
por Ciaran Liedeman 26.10.2011 / 16:37
3

Gerenciado para corrigir problemas semelhantes usando o início no nível de execução:

start on runlevel [2345]
    
por Laurynas 02.03.2013 / 12:21
3

Eu tive o mesmo problema e acabei resolvendo simplesmente com:

start on runlevel [2345]

sem net-device-up ou started networking stuff

Este é o script completo do upstart e funciona perfeitamente:

# MyApp

description     "MyApp"
author          "me"

start on runlevel [2345]
stop on runlevel [016]

respawn

exec /usr/bin/myapp 2>> /var/logs/myapp.log
    
por Daniele B 22.05.2014 / 22:11
1

Me deparei com chkconfig durante meu treinamento no RHCSA / CE:

sudo apt-get install chkconfig
sudo chkconfig pms on

Você pode verificar a página de manual da Oneiric para obter mais detalhes sobre suas capacidades .

    
por Oxwivi 26.10.2011 / 17:26
1

Encontrei uma solução para isso, mas não entendi. Se eu mover o PMS de /home/administrator e em /bin/pms com raiz como proprietário, tudo funcionará bem.

Se eu deixá-lo em /home/administrator/ , mas certifique-se de que root seja o dono de todas as barras do diretório /home/administrator/ , ele ainda não funciona.

Se eu definir o administrador como proprietário de tudo e alterar a parte pertinente do meu script para:

sudo su administrator -c '/home/administrator/pms-current/PMS.sh'

Ainda não funciona.

Suponho que por enquanto farei um diretório /home/root/ e moverei tudo para lá, embora eu realmente queira entender isso completamente.

    
por Kent Boogaart 26.10.2011 / 18:54
1

Eu tive um problema semelhante de "não iniciar" quando percebi que meu script dependia de um arquivo que estava em minha casa, e a casa não estava acessível porque estava criptografada com o mecanismo padrão do Ubuntu (.Private).

start on local-filesystems event é (provavelmente) emitido antes de o processo de decodificação ser finalizado.

    
por alessandro 01.05.2013 / 23:31
1

O seu diretório home está no NFS? Às vezes, o root não pode acessar o NFS.

Para o registro, no meu pequeno teste agora mesmo em 12.04:

  • start on started networking e start on network-interface-up INTERFACE=eth0 não funciona, mas

  • start on started network-interface INTERFACE=eth0 faz.

Graças ao link por apontar que initctl list sempre mostra a rede de trabalho interrompida.

    
por user94311 03.10.2012 / 18:54
0

No meu caso, o serviço upstart dependia do script localizado na pasta sincronizada do vagrant . Resolvido o problema usando a seguinte linha:

start on vagrant-mounted

Mais informações: link

    
por xuhcc 19.05.2015 / 15:09
0

Similar ao @xuhcc, vim aqui para descobrir por que meu script Vagrant Upstart não estava rodando. O seguinte deve funcionar:

  

inicie em vagrant-mounted

Mas não em algumas compilações devido ao seguinte bug.

link

A solução alternativa listada no relatório funcionou muito bem para mim:

$ cat /etc/init/workaround-vagrant-bug-6074.conf 
# workaround for https://github.com/mitchellh/vagrant/issues/6074
start on filesystem
task

env MOUNTPOINT=/vagrant

script
  until mountpoint -q $MOUNTPOINT; do sleep 1; done
  /sbin/initctl emit --no-wait vagrant-mounted MOUNTPOINT=$MOUNTPOINT
end script

Funcionou muito bem para mim

    
por Ian E 29.10.2015 / 03:09
0

funcionou para mim (eu preciso começar o serviço após iface up):

start on started networking and net-device-up IFACE=wlan1 
stop on shutdown

respawn
respawn limit 10 10
    
por MSS 25.12.2016 / 15:11