Parece que resolvi por screen
...
Primeiramente, removi o parâmetro Restart=always
.
Para que isso funcione, eu também precisei adicionar RemainAfterExit=True
.
Com antigos scripts de inicialização, ficou claro onde ter o código. Eu realmente não sei o que é um bom lugar para colocar o resto do código. Devo simplesmente chamar meu script de ExecStart=
?
Minhas descobertas adicionais durante o aprendizado.
status
Há uma boa pergunta (eu quis dizer que eu também estava interessado), como implementar a verificação de status - mensagem de status personalizada do systemd?
Resposta curta é, funciona (de alguma forma) fora da caixa = você não precisa se importar muito.
Então, para o meu serviço test_screen, eu posso chamar systemctl status test_screen.service
e eu irei
● test_screen.service - Testing 'screen' service
Loaded: loaded (/etc/systemd/system/test_screen.service; disabled; vendor preset: disabled)
Active: active (running) since Wed 2017-09-20 12:48:34 CEST; 1s ago
Process: 36633 ExecStart=/bin/screen -d -m -S test_screen (code=exited, status=0/SUCCESS)
Main PID: 36634 (screen)
CGroup: /system.slice/test_screen.service
├─36634 /bin/SCREEN -d -m -S test_screen
└─36635 /bin/sh
Sep 20 12:48:34 somehostname systemd[1]: Starting Testing 'screen' service...
Sep 20 12:48:34 somehostname systemd[1]: Started Testing 'screen' service.
... estranho é que quando eu paro, por status eu tenho falhado:
● test_screen.service - Testing 'screen' service
Loaded: loaded (/etc/systemd/system/test_screen.service; disabled; vendor preset: disabled)
Active: failed (Result: exit-code) since Wed 2017-09-20 12:51:00 CEST; 1s ago
Process: 36805 ExecStop=/bin/screen -S test_screen -X quit (code=exited, status=0/SUCCESS)
Process: 36633 ExecStart=/bin/screen -d -m -S test_screen (code=exited, status=0/SUCCESS)
Main PID: 36634 (code=exited, status=1/FAILURE)
Sep 20 12:48:34 somehostname systemd[1]: Starting Testing 'screen' service...
Sep 20 12:48:34 somehostname systemd[1]: Started Testing 'screen' service.
Sep 20 12:51:00 somehostname systemd[1]: Stopping Testing 'screen' service...
Sep 20 12:51:00 somehostname systemd[1]: test_screen.service: main process exited, code=exited, status=1/FAILURE
Sep 20 12:51:00 somehostname systemd[1]: Stopped Testing 'screen' service.
Sep 20 12:51:00 somehostname systemd[1]: Unit test_screen.service entered failed state.
Sep 20 12:51:00 somehostname systemd[1]: test_screen.service failed.
para superar isso eu tive que ter RemainAfterExit=True
(porque eu tentei a sugestão para ter Type=forking
e comentei que RemainAfterExit
opção).
list-unit-files
Eu tive um problema, que não posso reproduzir agora - quando tentei systemctl start
, a resposta era algo como "Nenhum arquivo de unidade", então eu estava me perguntando se há necessidade de registrá-lo de alguma forma. / p>
Não, você não precisa. Você pode executar systemctl list-unit-files --type=service
e deverá ver sua unidade lá. Meu problema era que o parâmetro ExecStart
estava errado. Quando tentei o mesmo agora, tenho mais facilidade para entender a mensagem:
$ systemctl start test_screen.service
Job for test_screen.service failed because the control process exited with error code. See "systemctl status test_screen.service" and "journalctl -xe" for details.
$ systemctl status test_screen.service
● test_screen.service - Testing 'screen' service
Loaded: loaded (/etc/systemd/system/test_screen.service; disabled; vendor preset: disabled)
Active: failed (Result: exit-code) since Wed 2017-09-20 12:55:53 CEST; 1min 3s ago
Process: 37344 ExecStart=/bin/screen2 -d -m -S test_screen (code=exited, status=203/EXEC)
Main PID: 36634 (code=exited, status=1/FAILURE)
Sep 20 12:55:53 somehostname systemd[1]: Starting Testing 'screen' service...
Sep 20 12:55:53 somehostname systemd[37344]: Failed at step EXEC spawning /bin/screen2: No such file or directory
Sep 20 12:55:53 somehostname systemd[1]: test_screen.service: control process exited, code=exited status=203
Sep 20 12:55:53 somehostname systemd[1]: Failed to start Testing 'screen' service.
Sep 20 12:55:53 somehostname systemd[1]: Unit test_screen.service entered failed state.
Sep 20 12:55:53 somehostname systemd[1]: test_screen.service failed.
Execução de script
Eu tentei modificar meu test_screen para chamar o script
$ cat /etc/systemd/system/test_screen_script.service
[Unit]
Description=Testing 'screen' service
[Service]
Type=forking
ExecStart=/root/test_screen_start.sh
ExecStop=/root/test_screen_stop.sh
#Environment=
#Restart=always
RemainAfterExit=True
[Install]
WantedBy=default.target
enquanto os scripts são apenas agrupados para chamadas anteriores
$ cat /root/test_screen_start.sh
/bin/screen -d -m -S test_screen
$ cat /root/test_screen_stop.sh
/bin/screen -S test_screen -X quit
quando fiz isso, não está inicializando:
$ systemctl start test_screen_script
Job for test_screen_script.service failed because the control process exited with error code. See "systemctl status test_screen_script.service" and "journalctl -xe" for details.
$ systemctl status test_screen_script.service
● test_screen_script.service - Testing 'screen' service
Loaded: loaded (/etc/systemd/system/test_screen_script.service; disabled; vendor preset: disabled)
Active: failed (Result: exit-code) since Wed 2017-09-20 15:47:59 CEST; 8s ago
Process: 63582 ExecStart=/root/test_screen_start.sh (code=exited, status=203/EXEC)
Main PID: 60698 (code=exited, status=0/SUCCESS)
Sep 20 15:47:59 somehostname systemd[1]: Starting Testing 'screen' service...
Sep 20 15:47:59 somehostname systemd[63582]: Failed at step EXEC spawning /root/test_screen_start.sh: Exec format error
Sep 20 15:47:59 somehostname systemd[1]: test_screen_script.service: control process exited, code=exited status=203
Sep 20 15:47:59 somehostname systemd[1]: Failed to start Testing 'screen' service.
Sep 20 15:47:59 somehostname systemd[1]: Unit test_screen_script.service entered failed state.
Sep 20 15:47:59 somehostname systemd[1]: test_screen_script.service failed.
Seria bom alguém poder descrever o motivo. A correção para isso é adicionar #!/bin/bash
.
Referências
- Descobri que
list-unit-files
aqui: link