Desenvolvi uma aplicação em java para linux, que fica mandando pacotes xml periodicamente para um servidor remoto, e escrevendo o status na tela assim que faz um envio de dados.
Gostaria de executar essa aplicação como serviço e iniciasse o mesmo assim que o linux fosse carregado.
Alguém poderia me dar uma luz???
Depende de que distribuição você está usando no Linux. Normalmente você tem de escrever um script e pô-lo em um diretório específico.
Por exemplo, no Debian (e no Ubuntu) você tem de criar um arquivo de script em /etc/init.d.
Um exemplo de como você pode pôr o JBoss como serviço no Debian 4.0 (copie os dados aqui para um arquivo "jboss" no diretório /etc/init.d e dê as permissões adequadas com chmod ugo+x:)
#!/bin/sh
# Execucao do jboss como servico
set -e
case "$1" in
start)
echo "Carregando JBOSS"
su -c '/usr/local/jboss/bin/run.sh -c default --host 0.0.0.0 2>&1 > /usr/local/jboss/server/default/log/console.log' - jboss &
;;
stop)
echo "Encerrando JBOSS"
/usr/local/jboss/bin/shutdown.sh -S
;;
*)
echo "Usage: /etc/init.d/jboss {start|stop}"
exit 1
esac
exit 0
Entendi…
Mas como faço pra finalizar o servico em java???
Acho q com o killall daria, mas precisava ser mais especifico, pois futuramente vou precisar usar mais de um serviço java, e não posso matar todos…
[code]#!/bin/sh
set -e
case “$1” in
start)
echo “Carregando Programa”
su -c /root/teste/java -jar teste.jar &
;;
stop)
echo “Encerrando Programa”
killall java
;;
*)
echo “Usage: /etc/init.d/teste {start|stop}”
exit 1
esac
Eu dei a dica de usar "start" e "stop"; rode algum programa (no stop) que mate "gentilmente" o seu programa.
Por exemplo, vocé pode deixar uma thread do seu programa checando uma vez por segundo se um determinado arquivo existe em um determinado diretório. Se esse tal arquivo existir, apague-o, faça o que for necessário para sair direitinho do seu programa, e saia com System.exit(0).
O "stop", no seu caso, simplesmente cria esse arquivo (talvez com o programa "touch") para que o programa Java saísse "direitinho".
Não use "killall" porque é um verdadeiro genocídio. Normalmente em Unix você faz o seguinte:
Ao iniciar algo com "&" (como você fez abaixo), é possível obter o PID desse programa (com $! ) e jogá-lo em um arquivo. (No caso abaixo, em /root/teste/teste.jar.pid mas você pode jogar em qualquer outro lugar)
su -c /root/teste/java -jar teste.jar &
echo $! > /root/teste/teste.jar.pid
Entendi, legal…
Mas nessa primeira forma, usando o system.exit() no caso criaria um arquivo quando iniciasse o programa?
Ai ficaria checando repetidamente a existencia do arquivo, caso eu apagasse o mesmo o programa finalizaria, é isso???
Esse segundo método também me ajudaria, pois vão ser raras as vezes em que vou dar o comando de stop no serviço.
Na verdade só de iniciar como serviço no linux já estaria legal.
Editei o codigo que vc criou acima, ve se execuraria corretamente:
[code]set -e
case “$1” in
start)
echo “Caregando teste”
cd /var/programa/teste
su -c java -jar teste.jar &
echo $! > /var/programa/teste.jar.pid
;;
stop)
echo “Encerrando teste”
kill ‘echo /var/programa/teste.jar.pid’
;;
*)
echo “Usage: /etc/init.d/testprog {start|stop}”
exit 1
esac
exit 0 [/code]
Fiz dessa maneira e salvei no etc/init.d
Dei as permissões para execução…
Criei um atalho no etc/rc3.d para iniciar com o sistema, mas não funcionou…
Amigo, cuidado - a aspa do “kill” não é a do apóstrofo ou acento agudo.
É a da crase ou acento grave; se for difícil digitar isso (digite uma crase e então um espaço - isso deve ficar na mesma tecla onde está o acento agudo, usualmente à direita da letra P), use Alt+96 (`) - segure a tecla Alt, e no teclado numérico tecle o número 96. Então solte a tecla Alt.
Amigo usei o comando com crase, como vc passou, mas não funcionou o comando kill.
criou o teste.jar.pid com o numero do processo, mas para finalizar com o kill deu o seguinte erro:
@root> kill teste.jar.pid
bash: kill: teste.jar.pid: arguments must be process or jobs IDs
Acho q o echo não está passando o numero do processo para o comando kill.
O comando para escrever no prompt o conteudo no arquivo é somente echo mesmo???
[quote=thingol]Só uma perguntinha - qual é o conteúdo do arquivo "/var/programa/teste.jar.pid "?
cat /var/programa/teste.jar.pid
[/quote]
O que tem dentro do arquivo teste.jar.pid é exatamente o numero do processo.
o cat me devolve exatamente o conteudo do arquivo, ou seja o número do processo.
Funciona legal, agora sim deu certo.
Consegui também outra maneira de finalizar o processo usando o grep
basta usar: kill ps ax|grep nomedoprocesso - O grep busca no ps o id do processo com o nome que vc especificou na busca e finaliza o mesmo.
Agora gostaria de saber se teria a possibilidade de colocar no start/stop os flags de [OK] e [FALHOU], analisando se os processos foram inicializados e/ou finalizados com sucesso…
Estou com um probleminha, bem chatinho. Estou instalando uma maquina com Ubuntu e preciso iniciar uma aplicação Java junto com o sistema.
tenho o seguinte Arquivo para iniciar o programa: /usr/lib/jvm/java-6-sun/bin/java -cp ./booster-1.08.jar br.com.xxxx.ras2.mts.booster.Main
Porem não consigo montar o script para inicializar pelo init.d.
Alguem poderia me ajudar.
Mesmo o post sendo antigo como foi de bastante utilizada para que eu podese resolver meu problema segue uma dica .
Coloque isso no inicio do seu script de serviço , aponte para o direto onde está instalado java.