创建一个经过编译并保留日志的多脚本 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. 创建整个过程的日志。换句话说,我想要将do_something,do_something_else发送wrapper到 stdout 和 stderr 的所有内容都放在一个日志文件中,该日志文件显示该脚本的日常运行,以便我可以 grep 查找错误。
  2. 我想预编译do_somethingdo_something_else这样wrapper我就可以将它们放入/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'

这当然只是一个示例,但实际上您所做的就是组织逻辑,按照使用任何语言的方式进行排列,然后触发所需的操作。我发现,如果我开始 shell 脚本时假设它们将被使用和维护,并且如果我使用函数编写它们,那么它们就像我所做的任何其他编程一样灵活且易于维护。

答案2

关于日志文件部分的所有内容:用于exec重定向stdout和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...     

相关内容