我有以下脚本,在提示符下input脚本名称(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.
但是当我build立一个CRON工作,它运行和scps文件,但内容是错误的,并且该文件不在服务器上(当rm线被注释掉,如我上面所示)。 这是我得到的输出,但注意:输出变化,它输出什么varys:
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作业没有按照系统运行时那样手动input命令的想法?
编辑:我修改了脚本循环和所有绝对寻址和修改CRON文件SHELL,PATH和HOMEvariables,但输出仍然不稳定,这里的脚本现在:
#!/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.
注意一些行上的date,'1'而不是'CMX1'和被欺骗的'XIS1'。
最终编辑:
看起来CRON似乎已经催生了多个互相绊倒的进程。 杀死了所有适用的stream程后, 克隆有一个历史(如果你做一些网上search)的多进程的多进程的产卵,所以要小心。
克朗的第一条规则是设置你期望的几件事情。 一,你在什么目录(明确地“CD”)。 二,你期望的path(在crontab中,PATH = …)和三个邮件去的地方(如果你想改变的话)
例如:
SHELL=/bin/sh PATH=/bin:/sbin:/usr/bin:/usr/sbin HOME=/var/log
然后,我也会让每个脚本根据需要设置额外的path,并始终如此
cd $HOME
或到另一个明确的path。
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"
第二次尝试的后续行动:
好吧,所以肯定是有一些东西。 事实上,你有两个XIS1是一个很好的迹象,无论是缓冲区没有被正确写入,或壳本身是罪魁祸首。 循环应该在运行时隔离每个主机,所以除非你有不需要刷新的pipe道/缓冲区/你有什么东西躺着,它不应该连续两次显示XIS1。 尝试明确地使用#!/bin/bash作为shell而不是sh,有时候供应商会把sh重新连接到bash以外的东西(而且这个循环是bash-ism,所以可能会导致问题)。 另外,在脚本done之前done一次sync ,看看它是否是一个缓冲问题。