Назад | Перейти на главную страницу

Неустойчивое поведение задания 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 есть история (если вы поищете ее в Интернете) ошибочных множественных процессов, так что будьте осторожны.

У 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

или на другой явный путь.