Unix

Bourne shell 腳本的 CRON 作業異常行為

  • January 14, 2010

我有以下腳本,當我在提示符下鍵入腳本名稱(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 作業時,它執行並 scps 文件,但內容錯誤,並且文件不在伺服器上(當 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 作業沒有像系統執行它一樣執行它的任何想法?

編輯: 我已將腳本修改為循環並使用所有絕對定址,並使用 SHELL、PATH 和 HOME 變數修改了 CRON 文件,但輸出仍然不穩定,現在是腳本:

#!/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 的第一條規則是設置您期望的幾件事。一,你在哪個目錄(明確地’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"

第二次嘗試的後續行動:

好的,所以有些東西肯定是嚇壞了。您獲得 2x XIS1 的事實很好地表明緩衝區沒有被正確寫入,或者外殼本身就是罪魁禍首。循環應該在執行時隔離每個主機,所以除非你有未沖洗的管道/緩衝區/你有什麼,它不應該連續顯示 XIS1 兩次。嘗試明確地使用#!/bin/bashas shell 而不是 sh,有時供應商會將 sh 重新掛鉤到 bash 以外的東西(並且循環是 bash 主義,因此可能會導致問題)。另外,在腳本中的sync前面加上一個done,看看它是否是一個緩衝問題。

引用自:https://serverfault.com/questions/101729