Adicionar item ao inittab no OpenSuse 12.1

7

Atualmente, estou trabalhando em um projeto que precisa ser adicionado a inittab para que o programa seja carregado durante a inicialização.

O programa que estou tentando iniciar é um aplicativo c # mono. Eu criei um script de início e se o script de início for executado manualmente, o programa será iniciado corretamente. No entanto, quando coloco em inittab , o programa não é iniciado.

Eu verifiquei em /var/log/messages , mas ele não diz que nada está errado, apenas diz que está recarregando.

Abaixo está o que eu adicionei ao meu script inittab

bes:2345:respawn:/home/bits/MyProgram/start.myprogram

Obrigado por qualquer ajuda que você possa fornecer

UPDATE Abaixo está o código no script de início que está localizado em / home / bits / MyProgram.

#!/bin/sh

cd /home/bits/MyProgram

/usr/bin/mono EmailServer.exe "$@"

Eu também tentei adicionar > mylog.txt no final da linha que começa com / usr / bin / mono, por exemplo,

/usr/bin/mono EmailServer.exe "$@" > mylog.txt

Se eu executar o script de início manualmente, mesmo que não esteja no diretório onde o script de inicialização está localizado, ele funciona bem, é apenas quando eu o adiciono ao inittab e executo o telinit q ele nunca inicia e o log não é escrito para, mas o log é gravado se eu iniciar o programa manualmente.

Obrigado por qualquer ajuda que você possa fornecer.

    
por Boardy 09.07.2012 / 19:45

4 respostas

4

O problema é simples, você está usando o OpenSuse 12.1, que usa systemd em vez de seu clássico < a href="http://en.wikipedia.org/wiki/SysV"> Sistema de inicialização do System V .

Para instalar um novo local de serviço, crie o seguinte arquivo em /etc/systemd/system/myprogname.service

[Unit]
Description=My progname service file

[Service]
ExecStart=/home/bits/MyProgram

[Install]
WantedBy=multi-user.target

Depois, execute systemctl daemon-reload e systemctl start myprogname.service

Se você quiser reiniciar o MyProgname automaticamente, adicione

Restart=restart-always

para a seção de serviços.

    
por 16.07.2012 / 15:01
6

Coloque seu programa em algum lugar.

Copie e edite o arquivo de modelo de esqueleto para o controle de trabalho do init localizado em /etc/init.d/skeleton .

Modifique este arquivo para indicar QUAL runlevel que você quer ... no seu exemplo, você quer 2,3,4,5, existem opções no topo do arquivo (nos comentários) para indicar os runlevels desejados

Coloque este novo arquivo em /etc/init.d com um nome descritivo. ( myfancyname usado no exemplo)

Um método agnóstico de plataforma para testar isso, ou para ativar / desativar (se você usou o arquivo esqueleto )

sudo /etc/init.d/myfancyname start
sudo /etc/init.d/myfancyname stop
sudo /etc/init.d/myfancyname restart

Existem métodos específicos de distribuição para realizar essas mesmas ações, por exemplo, o Debian usa update-rc.d myfancyname [iniciar | parar | ativar | desativar ...]

Modificar o inittab é geralmente uma idéia, se você estragar tudo, o sistema não inicializa mais, e então você tem DOIS problemas. (não é necessário regex!)

Adicionar scripts ao subdiretório /etc/init.d/ é mais padronizado, pode ser usado com quase QUALQUER sabor do linux, provavelmente alguns * nix's, talvez alguns bsd's.

    
por 14.07.2012 / 19:55
3

Você precisa executar telinit q para informar ao init para recarregar /etc/inittab , isso não será feito automaticamente. Eu acho que você fez isso desde que você mencionou a mensagem Re-reading inittab (você viu esta mensagem, certo?) Nos logs do sistema.

O problema é que o seu processo não está sendo iniciado ou que seu programa falha durante a inicialização? Escreva um script de wrapper que redirecione erros para um arquivo de log:

#!/bin/sh
exec >/var/log/myprogram.log 2>&1 
exec /home/bits/MyProgram/start.myprogram

Verifique se o arquivo de log foi criado e veja se algum erro aparece nele.

Uma coisa que vem à mente é que o seu programa pode exigir variáveis de ambiente que são definidas na sua sessão. O processo init tem um ambiente muito limitado. Se necessário, modifique o script wrapper para definir todas as variáveis necessárias.

    
por 10.07.2012 / 00:47
1

Quando init lê um Comando para executar em inittab , ele bifurca um shell e envia o Comando como um parâmetro para o comando exec nesse Concha. Então, verifique o que acontece se você fizer manualmente:

sh -c exec /home/bits/MyProgram/start.myprogram

Outra coisa que eu tentaria, seria ignorar completamente o script launcher, com algo parecido com isso no inittab:

bes:2345:respawn:/usr/bin/mono /home/bits/MyProgram/EmailServer.exe "$@"
    
por 14.07.2012 / 17:24