Shell脚本在开始时覆盖日志

时间:2015-10-25 14:45:53

标签: bash shell logging

我在/etc/init.d中有一个启动脚本,它调用我的主shell脚本来执行。 然后主脚本写入日志文件。它应该始终附加到现有的日志文件。

以下是我所拥有的设置:

  • 手动启动主脚本时,会附加到它使用的日志文件中。
  • 从/etc/init.d作为服务启动时,它会在第一次启动时覆盖日志。

我缺少什么?为什么在作为服务启动时会覆盖日志文件?

这里是入门脚本:

#!/bin/sh 

SPINDOWNCHECK_BINARY="/home/nzbget/hdd_spindown.sh"

start() {
if [ -e "/tmp/spindowncheck.pid" ]; then
        ## Program is running, exit with error.
        echo "Error! spindowncheck is currently running!" 1>&2
        exit 1
 else
    /home/nzbget/hdd_spindown.sh > /var/log/spindowncheck.log &
    echo "spindowncheck started"
    touch "/tmp/spindowncheck.pid"
fi
}

stop() {
   if [ -e "/tmp/spindowncheck.pid" ]; then
       ## Program is running, so stop it
       killall hdd_spindown.sh

       rm "/tmp/spindowncheck.pid"

       echo "spindowncheck stopped"
   else
       ## Program is not running, exit with error.
       echo "Error! spindowncheck not started!" 1>&2
       exit 1
   fi
}

case "$1" in
   start)
       start
       exit 0
   ;;
    stop)
       stop
       exit 0
   ;;
   reload|restart|force-reload)
       stop
       start
       exit 0
   ;;
   **)

        exit 1
   fi
}

esac

这是主要的脚本:

#!/bin/bash

echo "Reading config...." >&2
. /tmp/spindowncheck.conf

logfile='/var/log/spindowncheck.log'

while [ 1 ]
do
        i=0
        for DRIVE in $drives
        do
                DATE=`date +"%Y-%m-%d %H:%M:%S"`
                RESULT_OLD=${RESULT[i]}
                RESULT[$i]=`hdparm -C $DRIVE | grep state`

                if [ "$RESULT_OLD" != "${RESULT[i]}" ]
                        then echo $DATE $DRIVE ${RESULT[i]} >> $logfile
                fi

                i=$i+1
        done

        sleep 10
done

1 个答案:

答案 0 :(得分:0)

这一行:

/home/nzbget/hdd_spindown.sh > /var/log/spindowncheck.log &

破坏日志文件;将>替换为>>

此外,作为chepner noted,如果您希望进行shell算术,请使用(POSIX兼容)$((…))表示法,替换:

i=$i+1

使用:

i=$(($i+1))

或使用Bash扩展程序,例如:

((i=i+1))
((i+=1))
((i++))

在双括号内,您可以使用分配周围的空格。在Bash中,您不必明确地将$放在变量名称前面(除非您要取消引用数组元素,或者......)。在双括号内的赋值中,必须省略LHS变量名之前的$,就像在shell赋值中一样。