Неустойчивое поведение CRON с помощью сценария оболочки Bourne
У меня есть следующий скрипт, который работает нормально, когда я набираю имя скрипта в командной строке (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 есть история (если вы проводите в ней поиск по сети) с ошибочными множественными процессами, так что будьте осторожны.
2 ответа
Первое правило cron - настроить несколько вещей, которые вы ожидаете. Во-первых, в каком каталоге вы находитесь (явно 'cd' к нему). Два - ожидаемый путь (в crontab, PATH=...) и третий - куда отправляется почта (если вы хотите изменить ее).
Например:
SHELL=/bin/sh
PATH=/bin:/sbin:/usr/bin:/usr/sbin
HOME=/var/log
Затем я также должен был бы каждый сценарий либо установить дополнительные пути, если это необходимо, и всегда
cd $HOME
или к другому явному пути.
У 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"
Продолжение 2-й попытки:
Итак, что-то определенно срочно. Тот факт, что вы получили 2x XIS1, является хорошим признаком того, что либо буферы записываются неправильно, либо виновата сама оболочка. Цикл должен изолировать каждый хост во время его работы, поэтому, если у вас нет незапятнанных каналов / буферов / чего-то еще, он не должен показывать XIS1 два раза подряд. Попробуйте явно использовать #!/bin/bash
так как оболочка вместо sh, иногда производители переподключают sh к чему-то другому, чем bash (а цикл - это bash-ism, так что это может вызвать проблемы). Кроме того, положить sync
как раз перед done
в сценарии, чтобы увидеть, если это проблема буферизации.