AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / unix / Perguntas / 677191
Accepted
Basj
Basj
Asked: 2021-11-13 02:11:01 +0800 CST2021-11-13 02:11:01 +0800 CST 2021-11-13 02:11:01 +0800 CST

Reinicie e reinicie um script se houver erro

  • 772

Eu tenho um script (não escrito por mim, não posso modificá-lo) que tem que rodar por dias, que às vezes falha (sai com erro).

Nesse caso, tudo o que preciso fazer é reiniciar o servidor (não há solução melhor por enquanto) e reiniciar o script. Atualmente faço isso:

  • logar via SSH

  • screen -S job

  • ./myscript.shpara iniciar o trabalho (digamos que este script contém apenas: dothise este processo pode sair com um erro)

  • CTRL A, Dpara separar da tela

  • ...aguardar algumas horas...

  • faça login, retome a tela com screen -r job.

    Se ainda estiver em execução, desconecte e volte mais tarde.
    Se o script falhou, sudo reboot, e inicie na etapa 1, para que o trabalho longo continue.

Como fazer isso sem intervenção manual?

Como automatizar isso e fazer com que o servidor reinicie automaticamente se o script existir com um erro e, em seguida, reinicie o script?

shell-script gnu-screen
  • 1 1 respostas
  • 541 Views

1 respostas

  • Voted
  1. Best Answer
    sfphoton
    2021-11-13T07:59:16+08:002021-11-13T07:59:16+08:00

    Primeiro, eu tentaria colocar esse script em um contêiner. isso removeria algumas dependências do próprio host e permitiria a reinicialização automática.

    Solução usando docker e docker-compose

    Essa abordagem requer docker e docker compose. Se você tem o Ubuntu, você pode instalá-los via sudo apt install docker.io docker-compose.

    1. Crie um Dockerfile para construir seu contêiner, como:
    FROM ubuntu
    COPY /path/to/script/on/host /myscript.sh
    # maybe deal with some dependencies here
    CMD /bin/bash /myscript.sh
    

    Salve o nome acima como Dockerfileem qualquer pasta. Você pode ver alguns documentos em https://docs.docker.com/engine/reference/builder/

    1. Crie um docker-compose.yml
    version: "3.9"
    services:
      scriptrunner:
        build: .
        restart: always
    

    Coloque isso como docker-compose.ymlno mesmo diretório que seu Dockerfile. Veja alguns documentos aqui: https://docs.docker.com/compose/compose-file/compose-file-v3/

    Suponho que você queira obter alguma saída do script; nesse caso, talvez seja necessário configurar volumes do docker para "compartilhar" pastas entre seu host e o contêiner.

    1. Vá para sua pasta em um terminal e digite docker-compose up -d.

    Usando esse método, você coloca seu script em um contêiner, reiniciará o contêiner após cada falha de script e será executado como um daemon.

    Solução usando systemd

    Se você não quiser lidar com contêineres, você pode envolver seu script em outro, por exemplo my-runner.sh.

    #!/bin/bash
    /path/to/my-script.sh || systemctl reboot
    

    Isso reiniciará seu computador após a falha do script. Observe que a reinicialização pode exigir um comando diferente ou privilégios de root.

    E agora, vamos fazer um serviço systemd do nosso script runner. Este é um bom tutorial, mas se resume ao seguinte:

    Crie um arquivo de unidade systemd como /etc/systemd/system/my-script.servicee coloque o seguinte nele.

    [Unit]
    Description=my script runner service
    After=network.target
    Type=simple
    User=my-user
    ExecStart=/path/to/the/previous/my-runner.sh
    
    [Install]
    WantedBy=multi-user.target
    

    Agora você só precisa emitir systemcl start my-script && systemctl enable my-scriptpara iniciá-lo e fazê-lo iniciar após a reinicialização.

    • 1

relate perguntas

  • Subtraindo a mesma coluna entre duas linhas no awk

  • Um script que imprime as linhas de um arquivo com seu comprimento [fechado]

  • exportar variáveis ​​​​env programaticamente, via stdout do comando [duplicado]

  • Dividir por delimitador e concatenar problema de string

  • MySQL Select com função IN () com array bash

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    Possível firmware ausente /lib/firmware/i915/* para o módulo i915

    • 3 respostas
  • Marko Smith

    Falha ao buscar o repositório de backports jessie

    • 4 respostas
  • Marko Smith

    Como exportar uma chave privada GPG e uma chave pública para um arquivo

    • 4 respostas
  • Marko Smith

    Como podemos executar um comando armazenado em uma variável?

    • 5 respostas
  • Marko Smith

    Como configurar o systemd-resolved e o systemd-networkd para usar o servidor DNS local para resolver domínios locais e o servidor DNS remoto para domínios remotos?

    • 3 respostas
  • Marko Smith

    apt-get update error no Kali Linux após a atualização do dist [duplicado]

    • 2 respostas
  • Marko Smith

    Como ver as últimas linhas x do log de serviço systemctl

    • 5 respostas
  • Marko Smith

    Nano - pule para o final do arquivo

    • 8 respostas
  • Marko Smith

    erro grub: você precisa carregar o kernel primeiro

    • 4 respostas
  • Marko Smith

    Como baixar o pacote não instalá-lo com o comando apt-get?

    • 7 respostas
  • Martin Hope
    user12345 Falha ao buscar o repositório de backports jessie 2019-03-27 04:39:28 +0800 CST
  • Martin Hope
    Carl Por que a maioria dos exemplos do systemd contém WantedBy=multi-user.target? 2019-03-15 11:49:25 +0800 CST
  • Martin Hope
    rocky Como exportar uma chave privada GPG e uma chave pública para um arquivo 2018-11-16 05:36:15 +0800 CST
  • Martin Hope
    Evan Carroll status systemctl mostra: "Estado: degradado" 2018-06-03 18:48:17 +0800 CST
  • Martin Hope
    Tim Como podemos executar um comando armazenado em uma variável? 2018-05-21 04:46:29 +0800 CST
  • Martin Hope
    Ankur S Por que /dev/null é um arquivo? Por que sua função não é implementada como um programa simples? 2018-04-17 07:28:04 +0800 CST
  • Martin Hope
    user3191334 Como ver as últimas linhas x do log de serviço systemctl 2018-02-07 00:14:16 +0800 CST
  • Martin Hope
    Marko Pacak Nano - pule para o final do arquivo 2018-02-01 01:53:03 +0800 CST
  • Martin Hope
    Kidburla Por que verdadeiro e falso são tão grandes? 2018-01-26 12:14:47 +0800 CST
  • Martin Hope
    Christos Baziotis Substitua a string em um arquivo de texto enorme (70 GB), uma linha 2017-12-30 06:58:33 +0800 CST

Hot tag

linux bash debian shell-script text-processing ubuntu centos shell awk ssh

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve