Do init.d ao iniciante, existe uma ponte?

11

Eu tenho um script perfeitamente bom para uso em /etc/init.d. Na verdade, eu tenho muitos deles, todos criados com o Tanuki Java Service Wrapper.

Parece-me que poderia haver um modelo simples para agrupar um script de shell como um script inicial, mas um pouco de pesquisa no Google não está revelando nenhum.

Estou esquecendo de algo?

bmargulies
fonte

Respostas:

9

Não me lembro de ter visto um modelo para isso. É um pouco irônico, no entanto, tecnicamente, é o começo que está iniciando o script init.d em primeiro lugar, graças ao trabalho de compatibilidade com versões anteriores rc e rcS.

Eu consideraria reescrever o que você tem como um trabalho inicial, no entanto, eu sei que alguns scripts são difíceis de converter, então aqui está o que eu fiz por um tempo em alguns dos meus scripts:

description "xyz"
author "xyz"
start on runlevel 5
stop on runlevel [!5]

pre-start script
    # do my work here to start the service
end script

post-stop script
    # do work here to stop the service
end script

Agora, dependendo da natureza do serviço, se ele persistir ou se bifurcar, pode ser necessário adicionar expect forkou taskao arquivo do trabalho.

Apenas para concluir o pensamento, geralmente, isso é tudo o que há em um arquivo de trabalho inicial completo de qualquer maneira. Todo o trabalho pré-início é concluído, toda a limpeza é concluída, a única coisa que resta é o próprio serviço, que geralmente é adicionado com:

exec service_cmd
KFro
fonte
No inicio, a documentação diz que os níveis de execução 3,4 e 5 não são utilizados. Então, você só deve usar o nível 2. da execução
djangofan
já faz um tempo, mas tenho certeza de que o sistema 5 foi iniciado com a GUI iniciada, pelo menos costumava ser.
Joseph Rogers
6

Portanto, um ponto dos trabalhos iniciados é ser simples de escrever.

Há muita magia de script de shell nos scripts init.d que é repetida várias vezes. Declarações de caso, rastreamento de pidfile, linhas de comentário lsb. Não está muito claro como escrever um bom script init.d sem ter lido um.

Se você já teve o trabalho de escrever tudo isso, não precisa de um trabalho inicial, a menos que, como mencionei em outro comentário, dependa de outro trabalho / evento inicial.

Mas, realmente, o iniciante torna as coisas realmente simples. Você não deve precisar de uma pré-inicialização, a menos que precise configurar coisas como tmpdirs, ulimits ou argumentos de tempo de execução. Você não deve precisar de uma pós-parada, a menos que queira se arrumar depois de um serviço (o serviço realmente deve ser limpo após a saída normal).

Muitas vezes, um script init.d gigante com muitas opções se resume a um trabalho inicial de 10 a 15 linhas. Os scripts init.d mais complexos podem ter a maior parte de sua lógica despejada em pré-inicialização. A chave é que é apenas um pequeno trecho de código para configurar o ambiente para o processo, e não a lógica de lidar com start / stop / respawn / etc.

A parte mais difícil, e a que as pessoas mais erram, é saber quando iniciar / parar seu trabalho. start on runlevel [2345]parece lógico, mas ignora o fato de que a rede está surgindo paralelamente nesse ponto, assim como as montagens locais do sistema de arquivos. A chave é tentar descobrir exatamente as coisas mínimas que você precisa (outros serviços, sistemas de arquivos, rede, etc.) para executar e iniciar quando essas tarefas forem concluídas. A maioria dos serviços de rede tradicionais deve funcionar start on (local-filesystems and net-device-up IFACE!=lo).

SpamapS
fonte
3

Eu pensei que o Upstart mantém compatibilidade com versões anteriores com scripts init no estilo SysV /etc/init.d. Você deve ser capaz de usar apenas os scripts init inalterados.

Ryan C. Thompson
fonte
Sim, mas a ordem não é mais tão fácil de prever. Os trabalhos iniciados podem ser iniciados antes / depois do script rc2.d / S99mything estar em execução. Portanto, assim que você depende de um serviço gerenciado inicial, você precisa de um trabalho inicial.
SpamapS
2
Como um hack, você pode remover os seus scripts de inicialização a partir de níveis de execução específicos, e em vez adicionar um monte de linhas como /etc/init.d/myservice starta /etc/rc.local, na ordem correta. Isso garantirá que seus serviços sejam iniciados por último, depois de todos os outros serviços, incluindo aqueles iniciados pelos scripts de inicialização do Upstart.
Ryan C. Thompson