2015-10-25 2 views
1

У меня есть стартовый скрипт в /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 
+0

Чтобы быть уверенным, что 'overwrites' означает создание нового пустого файла или запись в предыдущий, но в существующих строках? –

+0

Я могу только сказать, что все, что было в журнале раньше (пример: 10 строк), исчезло и заменено новым журналом (пример: 1 строка). Таким образом, он может создать новый файл с тем же именем (но он должен был удалить старый ранее, чтобы это было возможно) – mon

+2

Эта строка: '/home/nzbget/hdd_spindown.sh>/var/log/spindowncheck. log & 'clobbers файл журнала; замените '>' на '>>'. –

ответ

0

Эта линия:

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

задавливает файл журнала; замените > на >>.


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

i=$i+1 

с:

i=$(($i+1)) 

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

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

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

Смежные вопросы