Tenho um servidor remoto rodando CentOS 7 só consigo acessar por SSH. Eu quero dois servidores java rodando neles o tempo todo, mesmo depois que o ISP reiniciar, etc. S
Então eu tentei fazer um serviço systemd que inicia os dois servidores java em uma tela. Não recebo nenhuma mensagem de erro quando inicio o serviço, mas ele morre instantaneamente: (systemctl status -l blogpatcher.service)
* blogpatcher.service - Start blogpatcher servers
Loaded: loaded (/etc/systemd/system/blogpatcher.service; enabled; vendor preset: disabled)
Active: inactive (dead) since Sat 2020-02-08 04:19:09 EST; 7s ago
Process: 22388 ExecStart=/usr/bin/bash /home/blogpatc/script/blogpatcher.sh (code=exited, status=0/SUCCESS)
Main PID: 22388 (code=exited, status=0/SUCCESS)
Aqui está o arquivo blogpatcher.service:
# vi /etc/systemd/system/blogpatcher.service
[Unit]
Description=Start blogpatcher servers
After=network.target
[Service]
Type=simple
ExecStart=/usr/bin/bash /home/blogpatc/script/blogpatcher.sh
TimeoutStartSec=90
[Install]
WantedBy=default.target
Aqui está o arquivo de script que o serviço executa:
# vi /var/tmp/test_script.sh
#!/bin/bash
screen -dmS syn bash -c 'cd /home/blogpatc/server/;java -cp bloghelper_artifact_main.jar com.aperico.bloghelper.server.ThesaurusServer;exec bash'
Se eu apenas executar o arquivo de script do console SSH, ele funcionará conforme o esperado e, como não há mensagem de erro, estou um pouco perplexo e me perguntando se alguém sabe qual é o problema?
Adicionar: "RemainAfterExit=yes" na seção [Service] permitirá que a tela permaneça aberta.
O problema provavelmente está
exec bash
no final. Obash
não recebe entrada e, portanto, sai. Se você fizer um exec de qualquer shell, isso fará o mesmo: nenhuma entrada restante, então o shell será encerrado.Mas mais fundamentalmente: por que usar
screen
? Qual é a vantagem aqui?Qual é o problema em apenas deixar o systemd fazer a reinicialização?
e
Systemd tem muitos parâmetros e possibilidades adicionais Você pode querer ler sobre eles. Por exemplo, se o script é usado apenas para definir o diretório de trabalho (e não como um começo para um script de inicialização mais elaborado como eu assumi), você pode querer olhar para
WorkingDirectory
, como o JdeBP sugeriu nos comentários.Se você insistir que
screen
deve ser usado no script de inicialização, a parte de serviço do seu arquivo de unidade provavelmente deve ser algo como:ou explorar
Type=forking
em vez deType=simple
.