Script de inicialização / desligamento do RedHat

0

Estou tentando criar um script de inicialização / desligamento para meu aplicativo, mas não tenho experiência com isso, então queria começar com a tela (vou me referir a ele como "test_screen").

Primeiramente, pensei em criar um script apenas em /etc/init.d E eu me inspirei aqui - link .

A ideia básica para simular minha aplicação é usar

  • screen -d -m -S test_screen para inicialização
  • screen -S test_screen -X quit para o encerramento
  • e screen –list para status (tipo de)

Mas quando tentei /etc/init.d/test_screen start , obtive

Reloading systemd:                                         [  OK  ]
Starting test_screen (via systemctl):  Failed to start test_screen.service: Unit not found.
                                                       [FAILED]

Então parece que eu tenho que criar uma unidade.

Eu tentei usar o link , então eu tenho meu arquivo de unidade em /etc/systemd/system :

# cat test_screen.service
[Unit]
Description=Testing 'screen' service

[Service]
Type=simple
ExecStart=/bin/screen -d -m -S test_screen
ExecStop=/bin/screen -S test_screen -X quit
Environment=
Restart=always

[Install]
WantedBy=default.target

A primeira pergunta é, devo ter /etc/init.d/test_screen start como ExecStart ou não? Definitivamente não será um forro ...

De qualquer forma, não está em execução. Em /var/log/messages , vejo

Sep 19 10:54:58 somehostname systemd: Started Testing 'screen' service.
Sep 19 10:54:58 somehostname systemd: Starting Testing 'screen' service...
Sep 19 10:54:58 somehostname systemd: test_screen.service holdoff time over, scheduling restart.
Sep 19 10:54:58 somehostname systemd: Started Testing 'screen' service.
Sep 19 10:54:58 somehostname systemd: Starting Testing 'screen' service...
Sep 19 10:54:58 somehostname systemd: test_screen.service holdoff time over, scheduling restart.
Sep 19 10:54:58 somehostname systemd: Started Testing 'screen' service.
Sep 19 10:54:58 somehostname systemd: Starting Testing 'screen' service...
Sep 19 10:54:59 somehostname systemd: test_screen.service holdoff time over, scheduling restart.
Sep 19 10:54:59 somehostname systemd: Started Testing 'screen' service.
Sep 19 10:54:59 somehostname systemd: Starting Testing 'screen' service...
Sep 19 10:54:59 somehostname systemd: test_screen.service holdoff time over, scheduling restart.
Sep 19 10:54:59 somehostname systemd: Started Testing 'screen' service.
Sep 19 10:54:59 somehostname systemd: Starting Testing 'screen' service...
Sep 19 10:54:59 somehostname systemd: test_screen.service holdoff time over, scheduling restart.
Sep 19 10:54:59 somehostname systemd: start request repeated too quickly for test_screen.service
Sep 19 10:54:59 somehostname systemd: Failed to start Testing 'screen' service.
Sep 19 10:54:59 somehostname systemd: Unit test_screen.service entered failed state.
Sep 19 10:54:59 somehostname systemd: test_screen.service failed.

Como posso encontrar o motivo, por que está entrando em estado de falha? Todas as sugestões são bem vindas.

    
por Betlista 19.09.2017 / 10:53

1 resposta

0

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
por 19.09.2017 / 13:13