로그를 컴파일하고 유지하는 다중 스크립트 bash 스크립트 만들기

로그를 컴파일하고 유지하는 다중 스크립트 bash 스크립트 만들기

저는 bash 스크립트 세트를 작성하고 있습니다.

첫 번째는 wrapper두 개의 스크립트를 호출합니다: do_somethingdo_something_else.

의사코드에서:

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

exit success

그러면 로그 파일이 생성됩니다.

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

나는 두 가지 목표를 가지고 있습니다:

  1. 전체 프로세스에 대한 로그를 만듭니다. 즉, stdout 및 stderr로 전송된 모든 내용이 스크립트의 일일 실행을 보여주는 로그 파일에 포함되어 do_something오류를 확인할 수 있기를 원합니다 do_something_else.wrapper
  2. 모든 시스템 에 넣을 수 있도록 do_something미리 컴파일하고 싶습니다 . 이렇게 하면 개발 중에 소스 코드를 보유하고 프로덕션에서 편집할 수 없는 코드를 빠르게 실행할 수 있습니다.do_something_elsewrapper/usr/binscp

가능합니까?

답변1

OP가 원하는 기능을 잃지 않고 스크립트에서 이 상황을 처리하는 방법에 대한 예는 다음과 같습니다.

  1. 여러 논리 블록을 동시에 실행하거나 한 번에 하나의 논리 블록을 실행하는 기능.

  2. 이러한 작업을 파일에 기록하는 기능.

이것은 간단한 예입니다. 스크립팅 언어를 다른 언어와 마찬가지로 취급하고 체계적인 코드를 작성하면 갑자기 그 언어로 모든 종류의 작업을 수행할 수 있습니다. 요령은 함수 외부에 느슨한 논리 덩어리를 두지 않는 것입니다. 그래야 쉽게 항목을 전환하고, 다른 것 대신 사용하고, 부분을 디버그하고, 로깅 함수를 추가할 수 있습니다. 이것이 제가 일반적으로 하는 일인 error_handler() 등입니다. 추가 작업이 거의 필요하지 않습니다. 즉, 무작위로 여러 행으로 쌓인 작업이 아닌 단순하지만 깨끗하고 유지 관리하기 쉬운 응용 프로그램이 완성된다는 의미입니다.

파일:내 물건

#!/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 $@

다음과 같이 실행할 수 있습니다.

./my_stuff 'run-all'

물론 이는 단지 예일 뿐이지만 실제로 여러분이 하는 일은 논리를 구성하고 모든 언어에서와 같은 방식으로 정렬한 다음 원하는 작업을 실행하는 것뿐입니다. 쉘 스크립트가 사용 및 유지 관리된다는 가정하에 쉘 스크립트를 시작하고 함수를 사용하여 작성하면 다른 프로그래밍만큼 유연하고 유지 관리가 쉽다는 것을 발견했습니다.

답변2

로그 파일 부분에 대한 모든 것: execstdout 및 stderr을 리디렉션하는 경우, date로그 파일 이름에 날짜를 입력하는 경우는 다음과 같습니다.

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

# output goes to the log file even if this is an external command
somecmd...     

관련 정보