
Atualmente estou trabalhando em um projeto que precisa ser adicionado inittab
para que o programa seja carregado durante a inicialização.
O programa que estou tentando iniciar é o aplicativo ac# mono. Eu criei um script inicial e se o script inicial for executado manualmente, o programa será iniciado corretamente. Porém, quando coloco no inittab
programa não inicia.
Fiz o check-in /var/log/messages
, mas não diz que há algo errado, apenas diz que está recarregando.
Abaixo está o que adicionei ao meu inittab
script
bes:2345:respawn:/home/bits/MyProgram/start.myprogram
Obrigado por qualquer ajuda que você possa fornecer
ATUALIZAR Abaixo está o código no script inicial 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 começando com /usr/bin/mono, por exemplo
/usr/bin/mono EmailServer.exe "$@" > meulog.txt
Se eu executar o script de início manualmente, mesmo que eu não esteja no diretório onde o script de início 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 é gravado, mas o log é gravado se eu iniciar o programa manualmente.
Obrigado por qualquer ajuda que você possa fornecer.
Responder1
Coloque seu programa em algum lugar.
Copie e edite o arquivo de modelo de esqueleto para controle de tarefa init encontrado em/etc/init.d/skeleton.
Modifique este arquivo para indicar QUAL nível de execução você deseja... no seu exemplo, você deseja 2,3,4,5, há opções no topo do arquivo (nos comentários) para indicar os níveis de execução desejados
Coloque este novo arquivo em/etc/init.dcom um nome descritivo. (meunomefancyusado no exemplo)
Um método independente de plataforma para testar isso ou para ativar/desativar (se você usou oesqueletoarquivo)
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 usaupdate-rc.d meunomefancy [iniciar|parar|ativar|desativar...]
Modificar o inittab égeralmentearuimideia, se você estragar tudo, o sistema não inicializa mais e você terá DOIS problemas. (não é necessário regex!)
Adicionar scripts ao subdiretório /etc/init.d/ é mais padronizado, pode ser usado com quase QUALQUER tipo de Linux, provavelmente alguns *nix's, talvez alguns bsd's.
Responder2
O problema é simples, você está usando o OpenSuse 12.1 queusa sistemaem vez do seu clássicoSistema 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 corre systemctl daemon-reload
esystemctl start myprogname.service
Se você deseja reiniciar automaticamente o MyProgname, você deve adicionar
Restart=restart-always
para a seção de serviço.
Responder3
Você precisa executar telinit q
para dizer ao init para reload /etc/inittab
, isso não fará isso automaticamente. Acho que você fez isso desde que mencionou a Re-reading inittab
mensagem (você viu essa mensagem, certo?) nos logs do sistema.
O problema é que o seu processo não está iniciando ou que o seu programa falha durante a inicialização? Escreva um script 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 aparece algum erro nele.
Uma coisa que vem à mente é que seu programa pode exigir variáveis de ambiente definidas em sua sessão. O init
processo tem um ambiente muito limitado. Se necessário, modifique o script wrapper para configurar todas as variáveis necessárias.
Responder4
Quando init
lê umComandopara executar inittab
, ele bifurca um shell e envia oComandocomo parâmetro para o exec
comando nesse shell. 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 do inicializador, com algo assim no inittab:
bes:2345:respawn:/usr/bin/mono /home/bits/MyProgram/EmailServer.exe "$@"