Por que meu serviço inicial não inicia na inicialização do sistema?


37

Seguindo esta pergunta , escrevi um serviço iniciante simples ( /etc/init/pms.conf ) para minha caixa sem servidor Ubuntu Server 11.04 da seguinte maneira:

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 na linha de comando:

service pms start

E eu posso ver que está realmente funcionando.

No entanto, quando eu inicializo minha máquina, o serviço não inicia. Se eu fizer o SSH na caixa e verificar o status do serviço, recebo:

$ service pms status
pms stop/waiting

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

ATUALIZAÇÃO 1 : sem saber se meu serviço estava sendo iniciado e subsequentemente morrendo ou simplesmente não estava sendo iniciado, adicionei o seguinte ao PMS.sh:

echo "STARTED" > $STARTLOG

Obviamente, isso me dá algo para procurar. Eu testei isso iniciando o serviço e verificando start.log . Excluí o start.log e reinicializei. Não estava lá após o reinício, então parece que o inicio definitivamente não está iniciando meu serviço. Suponho que poderia estar morrendo em um ponto anterior do processo, mas isso parece bastante improvável, dada a simplicidade de tudo.

ATUALIZAÇÃO 2 : Acabei de atualizar para a 11.10, que inclui uma atualização inicial, mas esse problema ainda ocorre.

ATUALIZAÇÃO 3 : conforme solicitado, inicializei com --debug. A saída do gato /var/log/syslog | grep inité muito longa para ser colocada na questão, mas você a vê aqui .

ATUALIZAÇÃO 4 : Mais registros, desta vez o conf inicial é incluído na parte superior. Execute 1 e 2 .


Tem certeza de que o script não foi executado? A mensagem pms stop / waiting significa que o trabalho inicial foi executado e que todos os comandos foram encerrados normalmente.
organize

Adicione a saída de cat /var/log/syslog | grep initdepois de habilitar o log de inicialização do upstart usando as instruções em Upstart Debugging
Ciaran Liedeman

@ Anarci: veja a atualização 3 na minha pergunta.
Kent Boogaart

A maioria dos usuários não vai dar lá fora, endereço de e-mail como esse, sim fornecer um link para um site Pastebin como Ubuntu pastebin
Ciaran Liedeman

@ Anarci: pronto - por favor, veja minha pergunta.
Kent Boogaart 26/10/11

Respostas:


19

Eu recomendaria aumentar a verbosidade do trabalho, por exemplo, usando entradas 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 em http://upstart.ubuntu.com/cookbook/

Também dê uma olhada em http://upstart.ubuntu.com/wiki/Debugging


Isso realmente está me incomodando. Tentei uma dúzia de coisas diferentes na parte de trás da sua postagem. Todos falharam com diversas mensagens obscuras nos logs. Minha última tentativa resultou em init: pms main process (1329) finalizado com o status 143 , o que significa nada para mim. Percebo que o PMS.sh nem está sendo iniciado porque a primeira coisa que faz é gravar em seu próprio log e essa entrada não está presente. Eu posso ver minha saída de pré-inicialização, que me diz que o arquivo de destino existe e é executável. Amanhã vou retomar o assunto, mas se você tiver alguma idéia, eu adoraria ouvi-las. Obrigado.
Kent Boogaart

oi @KentBoogaart, parece que tenho o mesmo problema. Você encontrou uma solução?
Daniele B

@KentBoogaart Tenho o mesmo problema que você? Alguma sorte com a sua?
Mevin Babu

14

O que provavelmente está acontecendo aqui é que o pms está sendo iniciado antes da instalação dos adaptadores de rede e provavelmente antes do adaptador de loopback (lo). Supondo que estamos falando do PS3 Media Server, é um serviço em 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

Ou seja, inicie após a ativação de qualquer interface de rede "real". No entanto, isso pode não ser o ideal, se eth0 for a próxima interface ativada, o PMS iniciará, mas você realmente deseja que o PMS use wlan0, isso não funcionará. O serviço será iniciado, mas pode não ter sido capaz de escolher a interface na qual você deseja ouvir. Supondo que você saiba a interface que você transmitirá e ela não será alterada, eu a codificaria no trabalho, por exemplo:

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

No Oneiric (11.10), você pode usar o evento static-network-uppara aguardar todos os dispositivos configurados estaticamente. O que é interessante, pois permite gravar trabalhos dependentes da rede sem codificar uma interface. [Nota: por "todos os dispositivos configurados estaticamente", estou me referindo ao uso em /etc/network/interfacesvez do NetworkManager. Não significa estática no sentido de IP estático versus DHCP.]


Pareceu o truque, mas não funcionou. Eu só tenho loe eth0mas eu usei a sua segunda sugestão: start on filesystem and net-device-up IFACE=eth0. Ainda não é possível após uma reinicialização. Acabei de notar algo no log do PMS que pode ser uma vantagem. Vou investigar e voltar ...
Kent Boogaart

É interessante. Uma coisa que não mencionei é que tentei o seu script original e ele funcionou na inicialização da minha máquina. Atribuí isso apenas à sorte do empate (ou seja, na minha condição de corrida, o carro bom venceu e no seu o carro ruim venceu). Realmente não consigo ver que outra dependência estamos perdendo aqui. Esquisito.
Mark Russell

2
Como você pode iniciá-lo após a inicialização, devemos estar perdendo outra dependência de serviço. Um truque sujo que pode funcionar (mas não nos ilumina) é simplesmente sleep 10inserir um - ou superior - em um "script de pré-inicialização" antes de executar o script de shell.
Mark Russell

Desculpe Mark - mas estamos na mesma página. Eu tentei a coisa do sono 10 já em um script de pré-inicialização. Não vá. Então eu tentei excluir o debug.log completamente e reiniciar. Após a inicialização, eu tinha o mesmo status de serviço e nenhum arquivo debug.log; portanto, não estou convencido de que o PMS seja realmente executado. Existe uma maneira fácil de diagnosticar isso? Se eu alterar o PMS.sh para cuspir alguma saída, para onde ela irá? Suponho que sempre posso direcioná-lo para meu próprio arquivo - posso dar uma chance a seguir.
Kent Boogaart 24/09/11

Acabei de atualizar minha pergunta com mais informações.
Kent Boogaart 24/09

3

Ao examinar seu syslog, o processo pms começa sem erros, mas depois de um tempo seu objetivo é alterado do início para o final, o que significa que ele foi eliminado.

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

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

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

Tente alterar sua sub-rotina de inicialização para

start on started networking

ou apenas muito

start on net-device-up IFACE=eth0

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

Isso deve garantir que seu processo seja iniciado apenas quando toda a configuração de rede estiver concluída, ou seja, o trabalho não apenas foi iniciado, mas concluído.

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


3

Consertado para corrigir um problema semelhante usando start on runlevel:

start on runlevel [2345]

3

Eu tive o mesmo problema e, finalmente, resolvi-o simplesmente com:

start on runlevel [2345]

sem qualquer net-device-upou started networkingmaterial

Este é o script inicial completo 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

1

Me deparei chkconfigdurante o meu treinamento RHCSA / CE:

sudo apt-get install chkconfig
sudo chkconfig pms on

Você pode verificar sua página de manual Oneiric para obter mais detalhes sobre seus recursos.


1

Encontrei uma solução para isso, mas não a entendo. Se eu mover o PMS para /home/administratordentro e para fora /bin/pmscom o root como proprietário, tudo funcionará bem.

Se eu deixá-lo em baixo, /home/administrator/mas garantir que o root seja o proprietário de tudo, exceto o /home/administrator/diretório em si, ele ainda não funcionará.

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, crie um /home/root/diretório e mova tudo para lá, embora eu realmente queira entender isso.


Então chkconfigtambém não funcionou? Você tentou fornecer o diretório PMS.shpara a raiz? Se apenas sua solução funcionar, acesse a página Barra de ativação do Upstart e entre em contato diretamente com os desenvolvedores.
Oxwivi

E se basta mover o .shbotão, deixe tudo lá e edite o script para apontar para esse diretório (ou talvez até mudar o diretório?).
Oxwivi 26/10/11

Sim, tentei tornar todo o diretório PMS de propriedade do root. Presumivelmente, não funcionou porque / home / administrator / não é de propriedade do root.
Kent Boogaart

De qualquer forma, isso não faz sentido, eu regularmente executo scripts no meu diretório / home via upstart sem problemas, estranho.
organize

Ainda mais estranho: eu apenas tentei de tudo em / home / root / que obviamente pertence ao root. Não funcionou. Mudei tudo de volta para / bin / pms e funcionou novamente. Portanto, parece que tentar inicializar o PMS de under / home não está funcionando no meu sistema.
Kent Boogaart

1

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

start on local-filesystems (provavelmente) é emitido antes do término do processo de descriptografia.


1

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

Para que conste, no meu pequeno teste agora no dia 12.04:

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

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

Agradecemos a http://os4.org/wiki/upstart.html por apontar que initctl list sempre mostra a rede de trabalhos como parada.


O link referenciado está quebrado.
Slm


0

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

começar em vagrant-montado

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

https://github.com/mitchellh/vagrant/issues/6074

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

Trabalhou muito bem para mim


0

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

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

respawn
respawn limit 10 10
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.