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 .
cat /var/log/syslog | grep init
depois de habilitar o log de inicialização do upstart usando as instruções em Upstart DebuggingRespostas:
Eu recomendaria aumentar a verbosidade do trabalho, por exemplo, usando entradas pré-início / pós-início.
Mais informações em http://upstart.ubuntu.com/cookbook/
Também dê uma olhada em http://upstart.ubuntu.com/wiki/Debugging
fonte
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:
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:
No Oneiric (11.10), você pode usar o evento
static-network-up
para 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/interfaces
vez do NetworkManager. Não significa estática no sentido de IP estático versus DHCP.]fonte
lo
eeth0
mas 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 ...sleep 10
inserir um - ou superior - em um "script de pré-inicialização" antes de executar o script de shell.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 estart on starting ...
andstart on started ...
.Tente alterar sua sub-rotina de inicialização para
ou apenas muito
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
fonte
Consertado para corrigir um problema semelhante usando start on runlevel:
fonte
Eu tive o mesmo problema e, finalmente, resolvi-o simplesmente com:
start on runlevel [2345]
sem qualquer
net-device-up
oustarted networking
materialEste é o script inicial completo e funciona perfeitamente:
fonte
Me deparei
chkconfig
durante o meu treinamento RHCSA / CE:Você pode verificar sua página de manual Oneiric para obter mais detalhes sobre seus recursos.
fonte
Encontrei uma solução para isso, mas não a entendo. Se eu mover o PMS para
/home/administrator
dentro e para fora/bin/pms
com 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:
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.fonte
chkconfig
também não funcionou? Você tentou fornecer o diretórioPMS.sh
para 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..sh
botão, deixe tudo lá e edite o script para apontar para esse diretório (ou talvez até mudar o diretório?).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.fonte
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 networking
estart on network-interface-up INTERFACE=eth0
não funciona, masstart 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.fonte
No meu caso, o serviço inicial dependia do script localizado na pasta sincronizada do vagrant . Resolvido o problema usando a seguinte linha:
Mais informações: http://razius.com/articles/launching-services-after-vagrant-mount/
fonte
Semelhante ao @xuhcc, vim aqui para descobrir por que meu script Vagrant Upstart não estava em execução. O seguinte deve funcionar:
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:
Trabalhou muito bem para mim
fonte
funcionou para mim (eu preciso iniciar o serviço após o iface up):
fonte