Журнал перезаписи сценария оболочки при запуске

У меня есть стартовый скрипт в /etc/init.d, который вызывает мой основной скрипт для выполнения. Основной сценарий затем записывает в файл журнала. Он всегда должен добавляться к существующему лог-файлу.

Вот что происходит с настройками, которые у меня есть:

  • При запуске основного сценария вручную он добавляет к используемому файлу журнала.
  • При запуске в качестве сервиса из /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 ответ

Решение

Эта строка:

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

забивает файл журнала; замещать > с >>,


Кроме того, как заметил chepner, если вы хотите выполнять арифметику оболочки, используйте (POSIX-совместимый) $((…)) обозначение, заменяющее:

i=$i+1

с:

i=$(($i+1))

или с расширениями Bash, такими как:

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

Внутри двойных скобок вы можете использовать пробелы вокруг назначений. В Bash вам не нужно явно указывать $ перед именами переменных (если вы не разыменовываете элемент массива, или...). В назначениях внутри двойных скобок вы должны опустить $ до имени переменной LHS, так же, как вы делаете это в назначениях оболочки.

Другие вопросы по тегам