Como fazer um arquivo jar rodar na inicialização e quando você sair?

30

Não faço ideia por onde começar a procurar. Eu tenho lido sobre daemons e não entendi o conceito.

Mais detalhes :

  • Escrevi um rastreador que nunca para e rastreia por RSS na internet.
  • O rastreador foi escrito em java - portanto, é um jar agora.
  • Sou administrador de uma máquina que possui o Ubuntu 11.04.
  • Há algumas chances de a máquina travar, então eu gostaria que o rastreador fosse executado toda vez que você inicializasse a máquina.
  • Além disso, eu gostaria que ele continuasse funcionando mesmo quando eu saísse. Não tenho certeza se isso é possível, mas na maioria das vezes estou desconectado e ainda quero que ele rastreie.

Alguma ideia? Alguém pode me apontar na direção certa?

Apenas procurando a solução mais simples.

RanZilber
fonte

Respostas:

32

Aqui está uma maneira fácil de fazer isso usando o SysVInit. Instruções:

  1. Crie o script de início e de parada do seu aplicativo. Coloque-o em algum diretório, no nosso exemplo é:

    • Iniciar script: /usr/local/bin/myapp-start.sh
    • Script de parada: /usr/local/bin/myapp-stop.sh

    Cada um fornecerá as instruções para executar / parar o aplicativo. Por exemplo, o myapp-start.shconteúdo pode ser tão simples quanto o seguinte:

    #!/bin/bash
    
    java -jar myapp.jar 

    Para o script de parada, pode ser algo como isto:

    #!/bin/bash
    # Grabs and kill a process from the pidlist that has the word myapp
    
    pid=`ps aux | grep myapp | awk '{print $2}'`
    kill -9 $pid
  2. Crie o seguinte script ( myscript) e coloque-o /etc/init.d.

    /etc/init.d/myscript conteúdo:

    #!/bin/bash
    # MyApp
    #
    # description: bla bla
    
    case $1 in
        start)
            /bin/bash /usr/local/bin/myapp-start.sh
        ;;
        stop)
            /bin/bash /usr/local/bin/myapp-stop.sh
        ;;
        restart)
            /bin/bash /usr/local/bin/myapp-stop.sh
            /bin/bash /usr/local/bin/myapp-start.sh
        ;;
    esac
    exit 0
  3. Coloque o script para começar com o sistema (usando o SysV). Basta executar o seguinte comando ( como root ):

    update-rc.d myscript defaults 

PS: Eu sei que o Upstart é ótimo e bla bla, mas prefiro o antigo sistema init SysV.

Marcos Roriz Junior
fonte
1
Mas como o sistema saberá qual parâmetro usará? Como definir o "início". Tentei aqui e não funcionou.
John John Pichler /
1
Isso funciona, mas o comando "service myapp start" não sai do comando.
22415 Tobia
Agora, como usar as opções start | stop | restart no myscript?
Codevalley 29/07
Além disso, mesmo depois de executar as 3 etapas, meu jar não está sendo executado na inicialização. Tem certeza de que precisamos alterar as permissões, o caminho ou algo assim?
Codevalley 29/07
@ Codevalley, como mencionei, esse método é para o init do SysV. Para usar o serviço ou outro comando, você precisará escrever um trabalho inicial. Mas se você estiver indo para fazer isso, você deve escrever um systemd (uma vez que está se tornando o padrão)
Marcos Roriz Júnior
6

Sim! É possível. :) O iniciante é o caminho a seguir para garantir que o serviço permaneça em execução. Possui cinco pacotes, todos instalados por padrão:

  • Upstart daemon init e utilitário initctl
  • upstart-logd fornece o daemon logd e o arquivo de definição de tarefa para o serviço logd
  • O upstart-compat-sysv fornece arquivos de definição de tarefa para as tarefas rc e as ferramentas de reinicialização, nível de execução, desligamento e telinit que fornecem compatibilidade com o SysVinit
  • startup-tasks fornece arquivos de definição de tarefa para tarefas de inicialização do sistema
  • system-services fornece arquivos de definição de tarefa para serviços tty

O aprendizado é muito agradável e vale a pena. Upstart tem um site: http://upstart.ubuntu.com/


fonte
No site Upstart, a partir de 2019: "O projeto está apenas no modo de manutenção. Nenhum novo recurso está sendo desenvolvido e o conselho geral seria passar para outro sistema ou sistema init mínimo"
Nav
2

3 sugestões rápidas ...

  1. Crie um script S tart no /etc/rc3.d(modo do console multiusuário) com os scripts K correspondentes /etc/rc.0e /etc/rc6.dmate seu programa Java de maneira controlada quando o sistema desligar (nível de execução 0) ou reinicializar (nível de execução 6) Consulte Uma introdução aos níveis de execução .

    Você pode iniciar o aplicativo Java no nível de execução 2 (rc2.d), mas, como rastreador, ele precisará de TCP / IP. Portanto, verifique se o serviço de rede está disponível / iniciado no nível de execução 2 com antecedência. A rede definitivamente está no nível de execução 3.

    /etc/init.dcontém todos os scripts de início / morte reais. /etc/rcN.dos diretórios contêm apenas links para eles, prefixados com S ou K para iniciá-los ou eliminá-los, respectivamente, por nível de execução N.

  2. Um processo executado por cronddeve persistir entre os logouts. Talvez adicione ao seu crontab.

  3. Um processo executado com nohuptambém deve persistir. Consulte nohup: execute um comando mesmo após o logout .

    $ nohup java -jar myapp.jar &

    Por padrão, myapp.jara saída padrão irá para um arquivo chamado ./nohup.out, ou $HOME/nohup.outse o primeiro não for gravável.


fonte
E quando eu sair, ele ainda será executado em segundo plano?
precisa saber é o seguinte
0

Também esteja ciente ao fazer aplicações com:

  update-rc.d myscript defaults 

Ter permissões 0755 e usar ou obter antes do seu .sh o caminho. Digamos que seu script esteja em /root/test.sh, você deve primeiro mudar para CD /root/antes de acessar test.sh.

Portanto, a melhor maneira é criar um SH no init.d e alterar o caminho para o seu she executá-lo na função start.

Şήøωў
fonte