Bourne shell 腳本的 CRON 作業異常行為
我有以下腳本,當我在提示符下鍵入腳本名稱(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/bash
as shell 而不是 sh,有時供應商會將 sh 重新掛鉤到 bash 以外的東西(並且循環是 bash 主義,因此可能會導致問題)。另外,在腳本中的sync
前面加上一個done
,看看它是否是一個緩衝問題。