У меня есть следующий сценарий, который обычно запускается, когда я набираю имя сценария в командной строке (logscript):
#!/bin/sh
dvar=`date +"%m\/%d\/%y"`
filedate=`date +%b%d%Y`
echo DSS1 > serverlog_${filedate}.txt
grep "^$dvar" oasErrLog >> serverlog_${filedate}.txt
echo CMX1 >> serverlog_${filedate}.txt
ssh GVECMX1 grep "^$dvar" /home/gve/log/oasErrLog >> serverlog_${filedate}.txt
echo CMX2 >> serverlog_${filedate}.txt
ssh GVECMX2 grep "^$dvar" /home/gve/log/oasErrLog >> serverlog_${filedate}.txt
echo XIS1 >> serverlog_${filedate}.txt
ssh GVEXIS1 grep "^$dvar" /home/gve/log/oasErrLog >> serverlog_${filedate}.txt
echo XIS2 >> serverlog_${filedate}.txt
ssh GVEXIS2 grep "^$dvar" /home/gve/log/oasErrLog >> serverlog_${filedate}.txt
scp serverlog_${filedate}.txt "GVEXOSR2:C:/Documents\ and\ Settings/gve/Desktop/logs"
#rm serverlog_${filedate}.txt
Пример нормального вывода:
DSS1
01/11/10 03:00:08.139 XIS run_backupserver - Startup of XISBACKUP backupserver complete.
CMX1
01/11/10 04:30:05.710 OMNICOMM 30274 - boatimesync: error 3 from boaRx rtu 35 pretry 1 {protocols/boa/boa_command.c:601}
01/11/10 04:30:12.117 OMNICOMM 30274 - CRC (0FFC) does not match calculated CRC (03B0) for remote JRS. headerLength=5 dataLength=0 crcByteOffset=2 functionCode=1 {protocols/boa/boa_io.c:1177}
CMX2
XIS1
XIS2
01/11/10 03:00:10.563 XIS run_backupserver - Startup of XISBACKUP backupserver complete.
НО, когда я настраиваю задание CRON, оно запускается и обрабатывает файл, но содержимое неверное, И файла нет на сервере (когда строка rm закомментирована, как я показал выше). Вот результат, который я получаю, но ПРИМЕЧАНИЕ: результат меняется, он зависит от того, что он выводит:
DSS1
CMX1
01/11/10 001/11/10 04:30:05.710 OMNICOMM 30274 - boatimesync: error 3 from boaRx rtu 35 pretry 1 {protocols/boa/boa_command.c:601}
01/11/10 04:30:12.117 OMNICOMM 30274 - CRC (0FFC) does not match calculated CRC (03B0) for remote JRS. headerLength=5 dataLength=0 crcByteOffset=2 functionCode=1 {protocols/boa/boa_io.c:1177}
CMX2
CMX2
CMX2
CMX2
XIS1
XIS1
XIS1
XIS1
XIS2
01/1101/11/10 001/11/10 03:00:10.563 XIS run_backupserver - Startup of XISBACKUP backupserver complete.
Есть идеи, почему задание CRON не выполняется точно так же, как система запускает его, когда команда вводится вручную?
РЕДАКТИРОВАТЬ: Я изменил скрипт на цикл и со всей абсолютной адресацией, а также изменил файл CRON с помощью переменных SHELL, PATH и HOME, но вывод все еще нестабильный, вот скрипт сейчас:
#!/bin/sh
### internal variable definitions
dvar=`date +"%m\/%d\/%y"`
filedate=`date +%b%d%Y`
# add the prefix of new hosts into the string below
# which will be expanded later into GVE(whatever) while looping
HOSTLIST="DSS1 CMX1 CMX2 XIS1 XIS2"
# main Loop
for SUFFIX in $HOSTLIST
do
echo $SUFFIX >> /home/gve/log/serverlog_${filedate}.txt
ssh GVE$SUFFIX grep "^$dvar" /home/gve/log/oasErrLog \
>> /home/gve/log/serverlog_${filedate}.txt
echo "\n" >> /home/gve/log/serverlog_${filedate}.txt
done
# transfer and delete file
scp /home/gve/log/serverlog_${filedate}.txt \
"GVEXOSR2:C:/Documents\ and\ Settings/gve/Desktop/logs"
#rm serverlog_${filedate}.txt
и вот результат:
DSS1
01/1201/12/10 03:00:08.323 XIS run_backupserver - Startup of XISBACKUP backupserver complete.
1
01/12/101/12/10 00:00:37.003 agc - dbioLower: DNP prev cmd may still in prog, name NPC_GT3_GOV raiseTimeout 1250 lowerTimeout 2500 curtime(1263286837:3) cmd_time(1263286834:807)
01/12/10 02:14:57.545 OMNICOMM 1562 - CRC (F110) does not match calculated CRC (1110) for remote ARS. headerLength=5 dataLength=10 crcByteOffset=7 functionCode=2 {protocols/boa/boa_io.c:1177}
CMX2
XIS1
XIS1
XIS2
01/12/101/12/10 03:00:10.408 XIS run_backupserver - Startup of XISBACKUP backupserver complete.
Обратите внимание на испорченные даты в некоторых строках, «1» вместо «CMX1» и дублированный «XIS1».
ОКОНЧАТЕЛЬНОЕ РЕДАКТИРОВАНИЕ:
Похоже, что каким-то образом CRON породил несколько процессов, которые спотыкались друг о друге. После убийства всех применимых процессов он исправился. У CRON есть история (если вы поищете ее в Интернете) ошибочных множественных процессов, так что будьте осторожны.
У CRON есть своя собственная среда.
Вы установили задание с помощью crontab -e как пользователь, выполняющий задание? Как была добавлена работа?
Кроме того, небольшая переделка скрипта с зацикливанием; это должно работать нормально в вашей настройке.
#!/bin/sh
### internal variable definitions
dvar=`date +"%m\/%d\/%y"`
filedate=`date +%b%d%Y`
# add the prefix of new hosts into the string below,
# which will be expanded later into GVE{whatever} while looping
HOSTLIST="DSS1 CMX1 CMX2 XIS1 XIS2"
# main processing loop
for SUFFIX in $HOSTLIST
do
echo $SUFFIX >> serverlog_${filedate}.txt
ssh GVE$SUFFIX grep "^$dvar" /home/gve/log/oasErrLog \
>> serverlog_${filedate}.txt
done
scp serverlog_${filedate}.txt \
"GVEXOSR2:C:/Documents\ and\ Settings/gve/Desktop/logs"
Продолжение второй попытки:
Итак, что-то определенно завязано. Тот факт, что у вас есть 2x XIS1, является хорошим признаком того, что либо буферы записываются неправильно, либо виновата сама оболочка. Цикл должен изолировать каждый хост во время его работы, поэтому, если у вас нет не промытых каналов / буферов / чего-то еще, он не должен показывать XIS1 два раза подряд. Попробуйте явно использовать #!/bin/bash
в качестве оболочки вместо sh, иногда поставщики повторно подключают sh к чему-то другому, кроме bash (а цикл - это bash-ism, поэтому это может вызвать проблемы). Кроме того, поставьте sync
прямо перед done
в скрипте, чтобы увидеть, не проблема ли это буферизации.
Первое правило cron - настроить несколько ожидаемых вами вещей. Во-первых, в каком каталоге вы находитесь (явно «cd» к нему). Два, путь, который вы ожидаете (в crontab, PATH = ...) и три, куда отправляется почта (если вы хотите его изменить).
Например:
SHELL=/bin/sh
PATH=/bin:/sbin:/usr/bin:/usr/sbin
HOME=/var/log
Затем я бы также попросил каждый сценарий либо настраивать дополнительные пути, если необходимо, и всегда
cd $HOME
или на другой явный путь.