Cria um script bash multi-script que é compilado e mantém um log

0

Estou escrevendo um conjunto de scripts bash.

O primeiro, wrapper chama dois scripts: do_something e do_something_else .

No pseudo código:

$ wrapper
do_something
if exitcode of do_something = 0 then 
    do_something_else
else
    exit with error
fi

exit success

Isso geraria um arquivo de log:

$ cat /var/logs/wrapper.log | tail -3
Deleting file 299
Deleting file 300
wrapper ran successfully on 01/01/18 00:01:00 GMT

Eu tenho dois objetivos:

  1. crie um log de todo o processo. Em outras palavras, tudo que do_something , do_something_else e wrapper enviam para stdout e stderr eu quero em um arquivo de log que mostra a execução diária desse script para que eu possa encontrar erros.
  2. Eu quero pré-compilar do_something , do_something_else e wrapper para que eu possa colocá-los em /usr/bin e scp em todos os meus sistemas. Desta forma, eu tenho uma fonte em dev e rápida execução de código não editável em prod.

Isso é possível?

    
por Marinaio 12.12.2017 / 18:43

2 respostas

0

Veja uma amostra de como lidar com esse cenário em um script, sem perder a funcionalidade que o OP deseja, que é:

  1. capacidade de executar vários blocos de lógica, todos eles, de uma só vez ou um de cada vez.

  2. Capacidade de registrar essas ações em um arquivo.

Este é um exemplo simples. Se você tratar a linguagem de script como faria com qualquer outra linguagem, e escrever código organizado, de repente você pode fazer todo tipo de coisas com ela. O truque é não deixar blocos de lógica solta fora das funções, assim você pode trocar as coisas facilmente, usar uma peça, não a outra, depurar seções, adicionar uma função de registro, que é o que eu faria normalmente, error_handler ( ), e assim por diante. Com quase nenhum trabalho extra, ou seja, você acaba com um aplicativo simples, mas limpo e fácil de manter, e não um monte de linhas de ações aleatórias empilhadas umas sobre as outras.

arquivo

: my_stuff

#!/usr/bin/env bash

logfile='logfile.log'

function main() {
  case "$1" in
    run-all)
      block_1
      block_2
      ;;
    run-1)
      block_1
      ;;
    run-2)
      block_2
      ;;
    *)
      echo 'No start option provided. Exiting'
      exit 1
      ;;
  esac
}
function block_1(){
  do_something

  if [ "$?" == 0 ]; then 
    do_something_else
    echo "Deleting file 299" >> $logfile
    echo "Deleting file 300" >> $logfile
    echo "wrapper ran successfully on 01/01/18 00:01:00 GMT" >> $logfile
  else
    exit "$?"
  fi
}
function block_2(){
  do_something

  if [ "$?" == 0 ]; then 
    do_something_else
    echo "Deleting file 299" >> $logfile
    echo "Deleting file 300" >> $logfile
    echo "wrapper ran successfully on 01/01/18 00:01:00 GMT" >> $logfile
  else
    exit "$?"
  fi
}
# $@ is the list of start arguments, which main will use
# with $1, $2, and so on.
main $@

Você executaria isso assim:

./my_stuff 'run-all'

Este é apenas um exemplo, mas na verdade tudo o que você faz é organizar a lógica, organizá-la da maneira que faria com qualquer idioma e depois acionar as ações desejadas. Eu acho que se eu iniciar scripts de shell assumindo que eles serão usados e mantidos, e se eu os escrever usando funções, eles serão tão flexíveis e fáceis de manter quanto qualquer outra programação que eu faça.

    
por 13.12.2017 / 19:15
0

Sobre o tudo em uma parte do arquivo de log: use exec para redirecionar o stdout & stderr, aqui date é usado para colocar a data no nome do arquivo de log:

#!/bin/bash
exec > /somedir/somelog.$(date +%F)
exec 2>&1

# output goes to the log file even if this is an external command
somecmd...     
    
por 13.12.2017 / 22:49