O Ubuntu usa o systemd. Você pode encontrar uma postagem de alguém fazendo uma pergunta semelhante nesta postagem
Outra abordagem seria usar algumas ferramentas de orquestração, como kubernetes ou docker swarm, para criar serviços que possam executar novamente o serviço, mesmo se ele falhar em algum momento.
Um exemplo com o docker:
No seu Dockerfile
FROM java:8-jre-alpine
COPY /location/of/your/jar/xyz.jar /where/you/want/it/stored/xyz.jar
CMD ["/bin/sh", "-c", "java -jar /where/you/want/it/stored/xyz.jar"]
Crie sua imagem do docker
docker build \
-t my-app:0.0.1-snapshot \ #specify a name for your image
/dockerfile/location/ # the location of your dockerfile
Para testar
docker run -it \ # -it represents interactive tty
-p 80:8080 \ # -p binds 8080 (the container port) to 80 (host port)
--restart=always \ # --restart=always run the service unless stopped by user
--name my-app \ # --name the name of your container
my-app:0.0.1-snapshot # the image you built with the build command
Teste com carteiro ou navegador para seu host local.
Você pode tentar reiniciar o computador e o aplicativo ainda deve ser executado.
Na produção, você usaria swarm ou kubernetes.
Para usar o swarm, você cria um arquivo docker-compose.yml
e deve armazenar suas imagens em um registro - uma imagem incorporada deve existir no nó de gerenciamento, se não for enviada para um registro.
No seu docker-compose.yml
version: '3.5'
services:
my-app:
image: my-app:0.0.1-snapshot
ports:
- "80:8080"
restart: always
No terminal:
docker swarm init
docker stack deploy my-app --compose-file ./docker-compose.yml
Você deve verificar a documentação para outros assuntos, como persistência e segurança.