O script bash pode ser usado para executar tarefas sequenciais e orientadas a eventos?

0

Gostaria de saber e como um script bash pode executar tarefas que precisam ser aplicadas uma após a outra.

Aqui está um exemplo, gostaria de instalar no meu CentOS VPS os seguintes softwares.

$ yum update
$ yum install libvpx-devel
$ sudo rpm -Uvh http://nginx.org/packages/centos/7/noarch/RPMS/nginx-release-centos-7-0.el7.ngx.noarch.rpm
$ yum install nginx
$ wget https //dl.google.com/linux/direct/google-chrome-stable_current_amd64.deb - Chrome_stable
$ mkdir foo
$ mv Chrome_stable foo

Você começa o ponto, eu tenho toneladas de comandos que devo fazer isso em uma base semanal. Então, minhas perguntas são, já que algumas instalações podem falhar, e outras precisam esperar que uma instalação seja finalizada para que a próxima continue.

Então, existe alguma maneira de dizer ao bash para esperar até que uma instalação / download seja concluída antes de ir para o próximo comando, e também para verificar se a instalação anterior foi um sucesso antes de mover uma.

    
por robue-a7119895 10.10.2014 / 15:36

1 resposta

4

Você não precisa dizer ao bash para esperar se os processos que você está executando são executados em primeiro plano (o que tudo que você mostra acima faz) - ele irá bloquear esperando que eles saiam.

Depois que eles saem, o bash pode examinar o código de retorno e se comportar de maneira diferente com base nisso. O código de retorno do último subprocesso é armazenado no $? variável:

#!/bin/bash

yum update

if [ $? -ne 0 ]; then
    echo "Sorry, yum update had non-zero exit code, why don't we stop here?"
    exit 1
fi

yum install libvpx-devel
...

Observe que a convenção Unix é que um código de retorno 0 significa que um processo foi bem-sucedido e um código de retorno de qualquer outra coisa significa que houve problemas. Os problemas podem ser simples (por exemplo, o grep não conseguiu encontrar a string que você estava procurando) ou mais complexo.

Observe também que você pode usar o & & e || operadores para alavancar o código de retorno em um one-liner:

yum update && echo "yum succeeded"

yum update || echo "yum failed"

Resposta a perguntas do @Contax no comentário:

A conexão entre "yum update" e "$?" é que todo programa que é executado possui um código de saída que é retornado ao sistema operacional. Geralmente, o padrão é 0 (sucesso) se o programa não especificar, mas pode ser especificado no programa (por exemplo, a "saída 1" mostrada no script acima está configurando o código de saída desse script para 1. Em C , "return (-1)" na função main () fará com que o programa tenha um código de saída de -1. Bash lê automaticamente este código de saída e o coloca em $? para o seu uso. Pense nisso como parte do encanamento - está atrás das paredes e faz tudo funcionar.

Se você tem muitas tarefas para executar, sim, isso fica tedioso. É por isso que 95% dos scripts de shell lá fora não fazem nenhuma verificação de erros e explodem de forma espetacular quando algo dá errado :) Você teria que criar uma cláusula if [ $? -ne 0 ]; then para cada tarefa. Se você fosse realmente aventureiro, poderia encontrar uma maneira de transformar suas execuções em um loop e reutilizá-lo, mas isso provavelmente seria mais um problema do que o necessário.

O || A taquigrafia é útil para comprometer a simplicidade do código e a verificação de erros. Como você percebeu, escrever uma cláusula if para tudo é uma PITA, mas yum update || exit 1 fará com que seu script atenda rapidamente e silenciosamente à falha desse processo. Menos amigável do que tomar o tempo para imprimir informações e limpar, mas é melhor do que continuar a executar comandos que estão fadados ao fracasso porque uma etapa anterior falhou.

    
por 10.10.2014 / 15:49

Tags