Журнал перезаписи сценария оболочки при запуске
У меня есть стартовый скрипт в /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, так же, как вы делаете это в назначениях оболочки.