【问题标题】:How do I log errors from variables in a bash shell script如何从 bash shell 脚本中的变量记录错误
【发布时间】:2020-12-07 12:30:36
【问题描述】:

我有一个工作脚本,它会检查客户端正在运行的操作系统,然后运行与检查客户端与主服务器的 NTP 偏移量差异相关的代码。

我想在 NTP 命令周围添加一些错误日志记录,但不知道从哪里开始。 任何指针将不胜感激。

#!/bin/bash


OS=`uname`

case $OS in
        [Linux]*)
Host=`hostname`
Offset=`ntpq -p | grep -e '*' | awk '{print $9}'`
Date=`date +%D`
CADate=`ntpdate -q 10.102.80.1 | awk '/nt/ {print $0}' | awk '{print $10}'`
TimeDiff=$(echo  $Offset - $CADate | bc )

#Output 
echo "$Host" "|" "$Date" "|" "$TimeDiff" > NTP.mif

        ;;
        [SunOS]*)
Host=`hostname`
Offset=`ntpq -p | tail -1 | awk '{print $9}'`
Date=`date +%D`
CADate=`ntpdate -q 10.102.80.1 | tail -1 | awk '{print $10}'`
TimeDiff=$(echo $Offset - $CADate | bc)

#Output
echo "$Host" "|" "$Date" "|" "$TimeDiff" > NTP.mif
        ;;
        [AIX]*)
Host=`hostname -s`
Offset=`ntpq -p | grep -e '*' | awk '{print $9}'`
Date=`date +%D`
CADate=`ntpdate -q 10.102.80.1 | awk '/nt/ {print $0}' | awk '{print $10}'`
TimeDiff=$(echo  $Offset - $CADate | bc )

#Output
echo "$Host" "|"  "$Date" "|" "$TimeDiff" > NTP.mif
        ;;
esac

【问题讨论】:

  • 错误记录在什么意义上?在这种情况下,什么是“错误”?
  • Any pointers would be greatly appreciated.shellcheck.net开头
  • @AndrewDorsett : 好老 set -x ?

标签: linux bash shell variables scripting


【解决方案1】:

重要的是要认识到有两种错误:

  • 您启动了一个 UNIX/Linux 命令,但出现了错误。
  • 您启动了一个命令,却看到了您不喜欢的结果。

在第一种情况下,错误结果转到基本错误流,称为1。可以像这样捕获错误并将其写入日志文件(我使用>>,因为我更喜欢附加到日志文件,而不是从头开始重新创建):

command 1>>logfile_error.txt

对于第二种情况,你有类似的东西:

bad_result=$(command)
// check that the result is bad indeed
bad_result >>logfile_error.txt

(在第二种情况下,基本错误流不是立即相关的)

显然,您可以将两者结合起来:

bad_result=$(command 1>>logfile_error.txt)
...
bad_result >>logfile_error.txt

【讨论】:

    【解决方案2】:

    除了输出重定向之外,您可能还需要有条件地决定应该捕获/打印出什么。 ..所以您可能有兴趣使用执行命令后给出的返回码,该命令可通过使用 $?

    获得

    https://www.tldp.org/LDP/abs/html/exit-status.html
    https://www.tldp.org/LDP/abs/html/exit-status.html#FTN.AEN2981

    只是一个用法示例:
    (不是真正的“好” - 在记事本中重写而无需进一步测试,但仍然可能对您有所帮助 - 可能会更好)

    #!/bin/bash
    
    Host=`hostname`
    OS=`uname`
    ntp_ip=10.102.80.1
    Date=`date +%D`
    
    Offset_data=`ntpq -p`
    Offset_rc=$? # you can a
    if [[ $Offset_rc -ne 0 ]]; then
      echo "Unable to.."
      #exit $Offset_rc # - uncomment if you don't want to continue 
                       #   with the script if your ntp command failed
    fi
    
    CADate_data=`ntpdate -q $ntp_ip`
    if [[ $? -ne 0 ]]; then # direct return code check
      echo "Unable to..,"
    fi
    
    case $OS in
            [Linux]*)
    Offset=`echo $Offset_data | grep -e '*' | awk '{print $9}'`
    CADate=`echo $CADate_data | awk '/nt/ {print $0}' | awk '{print $10}'`
            ;;
            [SunOS]*)
    Offset=`echo $Offset_data | tail -1 | awk '{print $9}'`
    CADate=`echo $CADate_data | tail -1 | awk '{print $10}'`
            ;;
            [AIX]*)
    Offset=`echo $Offset_data | grep -e '*' | awk '{print $9}'`
    CADate=`echo $CADate_data | awk '/nt/ {print $0}' | awk '{print $10}'`
            ;;
    esac
    
    TimeDiff=$(echo $Offset - $CADate | bc )
    #Output
    echo "$Host" "|" "$Date" "|" "$TimeDiff" > NTP.mif 
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-11-12
      • 1970-01-01
      • 2017-07-25
      • 1970-01-01
      • 2012-01-25
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多