Rodar app em segundo plano no linux

Dúvida concreta, parafraseando:

Desenvolvi uma API com Springboot e gerei um fatjar. Executo o fatjar com o comando:

   java -jar meuApp.jar

Quando eu fecho o terminal a minha aplicação pára, ou seja, o processo é finalizado.
Como eu faço para minha aplicação continuar rodando mesmo depois de fechar o terminal?

Uma maneira de resolver o problema é utilizando o utilitário `screen`.

Screen é um gerenciador de janelas em tela cheia que multiplexa um terminal físico entre vários processos (tipicamente shells interativos). Todas as janelas executam seus programas completamente independentes umas das outras.

Os programas continuam rodando quando sua janela não está visível no momento e tabmbém quando a sessão da tela é desconectada do terminal do usuário.

Se um programa termina, o screen (por padrão) finaliza a janela que o continha.

Agora que já sabemos o que é o screen, vamos aprender como utilizá-lo:

Pode instalar este utilitário com o comando:

   sudo apt install screen

Em alguns sistema linux este utilitário já vem instalado por padrão, então pode acontecer de não ser necessário instalar.

Uma vez que você já possui o utilitário instalado em seu sistema, será possível simplesmente executar o seu app com o seguinte comando:

   screen java -jar meuApp.jar

Pronto.

A sua aplicação já está executando. E ao finalizar a sua sessão do terminal, o seu aplicativo continuará em execução.


A primeira coisa que vai perceber é que agora você está preso na tela do terminal, pois não existe mais o shell disponível para digitar comandos, ele está executando o seu processo. Como eu saio deste ambiente sem parar o processo (utilizando o atalho `crtl+c`?).

Para isso você vai ter que voltar para o shell que estava em execução anteriormente (antes de executar o utilitário screen com o comando java -jar meuApp.jar)

Para isso basta executar a sequência de comandos:

ctrl+a e logo em seguida apertando a sequência ctrl+d.

Essa sequência de comandos vai fazer o detach do terminal.

Então teremos o nosso console do terminal de volta. E agora será possível sair do terminal (shell do servidor) com sucesso. Mantendo o processo anterior em execução.


Então beleza, agora outra situação, se eu consigo executar o meu processo em segundo plano, e sair do servidor...

Fiz login novamente no meu servidor remoto (no mesmo servidor em que eu estou executando o meu processo no `screen`, mas eu não consigo ver o meu processo em execução. Onde ele está executando?

Pois é, ele está executando em outra janela (outra sessão do shell), para ver ela em execução e retornar àquele contexto de execução vai ter que utilizar outro comando, um comando para ,,resumir'' ou continuar os screen que estão em no modo detached.

Para isso basta executar o comando:

    screen -r

Isso vai colocar o seu terminal (shell) no contexto de execução atual de onde aquele processo (anterior) estava executando.


Em caso de você possui mais de um screen em execução em segundo plano então é possível "listar" as janelas disponíveis para fazer o attach. Para isso use o comando:

   screen -x

Algo assim será exibido no terminal:

There are several suitable screens on:
    15917.pts-1 (14/04/2023 16:40:30)	(Detached)
    15892.pts-0 (14/04/2023 16:40:16)	(Detached)
Type "screen [-d] -r [pid.]tty.host" to resume one of them.

Após isso será possível retornar ao contexto da aplicação que escolher, basta seguir a instrução e utilizar o comando passado anteriormente para fazer o attach de um terminal "screen".

   screen -r 15917.pts-1

Em resumo seria isso.

Vantagens do utilitário screen

É um utilitário padrão do linux, cada terminal virtual fornece as funções de um terminal DEC VT100 e, além disso, várias funções de controle dos padrões ISO 6429 (ECMA 48, ANSI X3.64) e ISO 2022 (por exemplo, inserir/excluir linha e suporte para vários conjuntos de caracteres).

É bem pequeno para instalar (cerca de 672 kB [linux ubuntu]) mas é bem próximo disso para qualquer sistema baseado em unix.

Desvantagens do utilitário screen

Não mantém o processo funcionando em caso de erro. Neste caso o processo simplesmente pára a execução.

Para mais informações sobre o utilitário screen e para saber mais possibilidades de interação via linha de comando consulte a documentação.