我有以下脚本,当我在提示符下键入脚本名称(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 确实有自己的环境。
您是否使用 crontab -e 作为运行作业的用户安装了作业?工作是如何添加的?
此外,稍微重做脚本,循环;这应该可以在您的设置上正常工作。
第二次尝试的后续行动:
好的,所以有些东西肯定是吓坏了。您获得 2x XIS1 的事实很好地表明缓冲区没有被正确写入,或者外壳本身就是罪魁祸首。循环应该在运行时隔离每个主机,所以除非你有未冲洗的管道/缓冲区/你有什么,它不应该连续显示 XIS1 两次。尝试明确地使用
#!/bin/bash
as shell 而不是 sh,有时供应商会将 sh 重新挂钩到 bash 以外的东西(并且循环是 bash 主义,因此可能会导致问题)。另外,在脚本中的sync
前面加上一个done
,看看它是否是一个缓冲问题。cron 的第一条规则是设置您期望的几件事。一,你在哪个目录(明确地'cd'到它)。二,您期望的路径(在 crontab 中,PATH=...)和三,邮件的去向(如果您想更改它。)
例如:
然后,如果需要,我还会让每个脚本设置额外的路径,并且总是
或到另一个显式路径。