亚洲av成人无遮挡网站在线观看,少妇性bbb搡bbb爽爽爽,亚洲av日韩精品久久久久久,兔费看少妇性l交大片免费,无码少妇一区二区三区

Chinaunix

標(biāo)題: 求助:aix中,能否自動(dòng)將crontab作業(yè)前天出錯(cuò)的日志保存到另一個(gè)文本中 [打印本頁(yè)]

作者: bzbenjoy    時(shí)間: 2011-09-06 22:54
標(biāo)題: 求助:aix中,能否自動(dòng)將crontab作業(yè)前天出錯(cuò)的日志保存到另一個(gè)文本中
本帖最后由 bzbenjoy 于 2011-09-07 21:41 編輯

在aix中,/var/adm/cron/log記錄了crontab的執(zhí)行情況,log格式如下:
  1. ............
  2. oracle2   : CMD ( /u33/admin/autofree.sh  ) : PID ( 229730 ) : Tue Sep  5 15:23:00 2011
  3. Cron Job with pid: 229730 Successful
  4. root      : CMD ( /usr/run_ssa_encl_healthcheck) : PID ( 327904 ) : Tue Sep  5 15:30:00 2011
  5. root      : CMD ( /u33/admin/check_icmrm.sh ) : PID ( 303494 ) : Tue Sep  5 15:30:00 2011
  6. Cron Job with pid: 327904 Successful
  7. Cron Job with pid: 303494 Failed
  8. oracle2   : CMD ( /u33/admin/bkarch.sh ) : PID ( 606448 ) : Tue Sep  6 15:31:00 2011
  9. Cron Job with pid: 606448 Successful
  10. oracle2   : CMD ( /u33/admin/autofree.sh ) : PID ( 512120 ) : Tue Sep 6 15:33:00 2011
  11. Cron Job with pid: 512120 Successful
  12. ............
復(fù)制代碼
現(xiàn)在我想通過(guò)一個(gè)腳本文件,每次執(zhí)行的時(shí)候,能夠找出相對(duì)于系統(tǒng)時(shí)間前一天,crontab出錯(cuò)的行數(shù),然后保存到另一個(gè)文本,
大概像這樣子:
  1. ..........
  2. root      : CMD ( /u33/admin/check_icmrm.sh ) : PID ( 303494 ) : Tue Sep  5 15:30:00 2011
  3. Cron Job with pid: 303494 Failed
  4. ..........
復(fù)制代碼
要用awk找出failed那行很簡(jiǎn)單,但是,怎么將failed所對(duì)應(yīng)的那命令行(就是有cmd命令,執(zhí)行時(shí)間的那行)也找出來(lái),這個(gè)很頭痛,比如說(shuō)上面這個(gè)例子,awk執(zhí)行完上面的root那行后,才會(huì)讀取303494的這行,發(fā)現(xiàn)failed后,沒(méi)法再回退到前一行(或幾行,因?yàn)橛行┳鳂I(yè)執(zhí)行時(shí)間比較久,兩條記錄中間可能會(huì)有間隔)找到相同PID的那行,打印出來(lái)啊,就算把保存一個(gè)和log相同內(nèi)容的文本,2個(gè)文本來(lái)比較,也很難實(shí)現(xiàn)
      還有,截取前一天的記錄,比如,現(xiàn)在系統(tǒng)時(shí)間是2011年9月6號(hào),截取2011年9月5號(hào)的記錄(文本中Tue Sep 的那些行),這個(gè)怎么處理,第一點(diǎn),時(shí)間怎么匹配,還有,由于關(guān)鍵字在每行的倒數(shù)幾個(gè)域(倒3個(gè)域到倒數(shù)5個(gè)域),但是,從上面root行可以看出來(lái),由于CMD夸號(hào)里面的命令長(zhǎng)短都不一樣,因此,雖然awk可跟蹤域的個(gè)數(shù),但是域長(zhǎng)度不定的話,怎么定位到需要的那幾個(gè)域啊?
      有沒(méi)有高手感興趣的,能否提供點(diǎn)建議,想這個(gè)想好久了,還是沒(méi)能想出來(lái)該怎么實(shí)現(xiàn),或者,能用別的方式也好,只要能達(dá)到效果也行啊

****************************************************************************************************************************************************************************************************************

補(bǔ)充:
       非常感謝jason680大大和yinyuemi,我今天試了一下,strftime的確不支持strftime,date -d倒是沒(méi)有試過(guò)
      還有,我昨天沒(méi)有說(shuō)清楚,cmd夸號(hào)里面的命令長(zhǎng)度不一樣,是指有可能多了重定向之類的,這樣的話就不好定位時(shí)間和PID序列號(hào)是在哪一個(gè)域,比如:
  1. root      : CMD ( /usr/lpp/diagnostics/bin/run_ssa_encl_healthcheck 1>/dev/null 2>/dev/null ) : PID ( 1700156 ) : Tue Sep  6 20:30:00 2011
復(fù)制代碼
這個(gè)的話,兩位大大的方法就有點(diǎn)不適用
      根據(jù)兩位大大的思路,我寫了下面的方法來(lái)嘗試:
  1. awk -v var=`date "+%a"`   -v Rec=100 'BEGIN{a["Mon"]="Sun";a["Tue"]="Mon";a["Wed"]="Tue";a["Thu"]="Wed";a["Fri"]="Thu";a["Sat"]="Fri";a["Sun"]="Sat"}
  2. {if ($6=="Failed"){n=(n+1)%Rec;b[n]=$5;m[n]=$0}}
  3. {if($0 ~a[var])
  4.                          {for(n=0;n<Rec;n++)if($0 ~b[n])
  5.                                                 {print $0"\n"m[n]}
  6.                         }
  7. }' log
復(fù)制代碼
不過(guò),執(zhí)行后,發(fā)現(xiàn)$0,然后空行,然后$0,然后空行,重復(fù)了一百遍(還是99遍?現(xiàn)在有點(diǎn)忘了),然后在輸出下一條出錯(cuò)的$0,比如這樣一種重復(fù)
  1. root      : CMD ( /mapsdata/mapsp/adm/perf.sh ) : PID ( 1765822 ) : Tue Sep  6 20:10:00 2011

  2. root      : CMD ( /mapsdata/mapsp/adm/perf.sh ) : PID ( 1765822 ) : Tue Sep  6 20:10:00 2011

  3. root      : CMD ( /mapsdata/mapsp/adm/perf.sh ) : PID ( 1765822 ) : Tue Sep  6 20:10:00 2011

  4. root      : CMD ( /mapsdata/mapsp/adm/perf.sh ) : PID ( 1765822 ) : Tue Sep  6 20:10:00 2011
復(fù)制代碼
把參數(shù) Rec=2和最后的輸出print $0"\n"m[n]換成print $0的話,倒是可以輸出全部出錯(cuò)的$0,如:
  1. root      : CMD ( /mapsdata/mapsp/adm/perf.sh ) : PID ( 1765822 ) : Tue Sep  6 20:10:00 2011
  2. root      : CMD ( /mapsdata/mapsp/adm/autokill.sh 1>>/mapsdata/mapsp/tmp/autokill.log 2>>/mapsdata/mapsp/tmp/autokill.log ) : PID ( 1765832 ) : Tue Sep  6 20:13:00 2011
復(fù)制代碼
只是這樣的話,就缺了Failed那行,到底是為什么? 還有,有解決的辦法嗎?
作者: jason680    時(shí)間: 2011-09-07 00:01
在aix中,/var/adm/cron/log記錄了crontab的執(zhí)行情況,log格式如下:
............
oracle2   : CMD ( /u ...
bzbenjoy 發(fā)表于 2011-09-06 22:54



Rec是用來(lái)保留Failed時(shí)..往前找?guī)醉?xiàng)CMD用...
$ awk -F'[ )]+' -v Rec=100 'BEGIN{d1=strftime("%b %e",systime()-24*3600)}{if($2=="CMD"{n=(n+1)%Rec;a[n]=$5;m[n]=$0;d[n]=sprintf("%s %2d",$7,$}if($6=="Failed"{for(n=0;n<Rec;n++)if(a[n]==$5&&d1==d[n]){print m[n]"\n"$0}}}' log
root      : CMD ( /u33/admin/check_icmrm.sh ) : PID ( 303494 ) : Tue Sep  5 15:30:00 2011
Cron Job with pid: 303494 Failed

* d1是用產(chǎn)生前一天日期...(Sep 5)
   Sep 5 應(yīng)該是Mon,但你的log是Tue就不檢查了
* 找到CMD時(shí)($2=="CMD"
   用PID號(hào)碼($5),保留全部(m[n]=$0)及日期(d[n]=sp...,$7,$
* 找到Failed時(shí)($6=="Failed"....
   由剛保留記錄中,找出相對(duì)的PID(a[n]==$5) ,日期為前一天 d1==d[n]
作者: yinyuemi    時(shí)間: 2011-09-07 00:04
本帖最后由 yinyuemi 于 2011-09-07 01:25 編輯

回復(fù) 1# bzbenjoy
  1. echo 'oracle2   : CMD ( /u33/admin/autofree.sh  ) : PID ( 229730 ) : Tue Sep  5 15:23:00 2011
  2. Cron Job with pid: 229730 Successful
  3. root      : CMD ( /usr/run_ssa_encl_healthcheck) : PID ( 327904 ) : Tue Sep  5 15:30:00 2011
  4. root      : CMD ( /u33/admin/check_icmrm.sh ) : PID ( 303494 ) : Tue Sep  5 15:30:00 2011
  5. Cron Job with pid: 327904 Successful
  6. Cron Job with pid: 303494 Failed
  7. oracle2   : CMD ( /u33/admin/bkarch.sh ) : PID ( 606448 ) : Tue Sep  6 15:31:00 2011
  8. Cron Job with pid: 606448 Successful
  9. oracle2   : CMD ( /u33/admin/autofree.sh ) : PID ( 512120 ) : Tue Sep 6 15:33:00 2011
  10. Cron Job with pid: 512120 Successful' |\
  11. awk -v var="$(date -d yesterday +"%b  %d"|sed 's/0//')" -v RS="root"  -v FS="\n" '$1~var{for(i=2;i<=NF;i++)if($i~/Failed/)t=t ORS $i;printf t?"root" $1 t ORS:""}'

  12. root      : CMD ( /u33/admin/check_icmrm.sh ) : PID ( 303494 ) : Tue Sep  5 15:30:00 2011
  13. Cron Job with pid: 303494 Failed
復(fù)制代碼
aix環(huán)境可能不支持date -d,見4#
作者: jason680    時(shí)間: 2011-09-07 00:26
回復(fù)  bzbenjoy
yinyuemi 發(fā)表于 2011-09-07 00:04


yinyuemi大..
awk -v var="$(date -d yesterday +"%b  %d"|sed 's/0//')"
1. 你太依賴外在命令,不知lz的aix,有沒(méi)有支持date -d ....
2. s/0// 有可能把 Sep 10 ==> Sep 1
作者: yinyuemi    時(shí)間: 2011-09-07 00:47
本帖最后由 yinyuemi 于 2011-09-07 01:25 編輯

回復(fù) 4# jason680


    謝謝提醒,沒(méi)注意lz的運(yùn)行環(huán)境是AIX,應(yīng)該不支持date -d
    你代碼中的strftime是GNU擴(kuò)展的,nawk可能也不支持。
    我從星期上考慮的,不知是否可行?代碼如下:
  1. echo 'oracle2   : CMD ( /u33/admin/autofree.sh  ) : PID ( 229730 ) : Mon Sep  5 15:23:00 2011
  2. Cron Job with pid: 229730 Successful
  3. root      : CMD ( /usr/run_ssa_encl_healthcheck) : PID ( 327904 ) : Mon Sep  5 15:30:00 2011
  4. root      : CMD ( /u33/admin/check_icmrm.sh ) : PID ( 303494 ) : Mon Sep  5 15:30:00 2011
  5. Cron Job with pid: 327904 Successful
  6. Cron Job with pid: 303494 Failed
  7. oracle2   : CMD ( /u33/admin/bkarch.sh ) : PID ( 606448 ) : Tue Sep  6 15:31:00 2011
  8. Cron Job with pid: 606448 Successful
  9. oracle2   : CMD ( /u33/admin/autofree.sh ) : PID ( 512120 ) : Tue Sep 6 15:33:00 2011
  10. Cron Job with pid: 512120 Successful' |\
  11. awk -v var="$(date "+%a")" -v RS="[^\n]+: CMD"  -v FS="\n" 'BEGIN{a["Mon"]="Sun";a["Tue"]="Mon";a["Wed"]="Tue";a["Thu"]="Wed";a["Fri"]="Thu";a["Sat"]="Fri";a["Sun"]="Sat"}{b[NR+1]=RT}$1~": "a[var]{for(i=2;i<=NF;i++)if($i~/Failed/)t=t ORS $i;printf t?b[NR] $1 t ORS:"";t=""}'
  12. root      : CMD ( /u33/admin/check_icmrm.sh ) : PID ( 303494 ) : Mon Sep  5 15:30:00 2011
  13. Cron Job with pid: 303494 Failed
復(fù)制代碼

作者: bzbenjoy    時(shí)間: 2011-09-07 20:54
回復(fù) 2# jason680


  jason680大大,您好,你給我的建議中,Rec=100,n=(n+1)%Rec是用來(lái)做什么的? 能稍微解釋一下嗎?
作者: jason680    時(shí)間: 2011-09-08 09:09
本帖最后由 jason680 于 2011-09-08 09:10 編輯
回復(fù)  jason680


  jason680大大,您好,你給我的建議中,Rec=100,n=(n+1)%Rec是用來(lái)做什么的? 能稍 ...
bzbenjoy 發(fā)表于 2011-09-07 20:54


基本上Rec它是用來(lái)限制數(shù)組大小用的....
因?yàn)橐话鉲og紀(jì)錄,可能會(huì)很多....
就如你說(shuō),當(dāng)你找到pid: xxxx Failed時(shí),前面CMD的紀(jì)錄已經(jīng)過(guò)了....
root : CMD ( /usr/run_ssa_encl_healthcheck) : PID ( 327904 ) : Tue Sep 5 15:30:00 2011
root : CMD ( /u33/admin/check_icmrm.sh ) : PID ( 303494 ) : Tue Sep 5 15:30:00 2011
Cron Job with pid: 327904 Successful
Cron Job with pid: 303494 Failed

一般我們使用的方法,就是先把CMD存下來(lái)(放在數(shù)組中)
但在log中CMD的紀(jì)錄有可能很多,會(huì)影響效率....
所以我想到的方法就是限制數(shù)組大小

Rec=100
n =(n+1)%Rec
n為0時(shí), 執(zhí)行結(jié)果 n=1
n為1時(shí), 執(zhí)行結(jié)果 n=2
...
n為98時(shí), 執(zhí)行結(jié)果 n=99
n為99時(shí), 執(zhí)行結(jié)果 n=0
n為99, n+1為100, 因?yàn)槎嗔?Rec (等同%100),
結(jié)果n又為0,紀(jì)錄又從頭開始.

剛剛在寫說(shuō)明時(shí)發(fā)現(xiàn),這可能有個(gè)bug(但也有可能沒(méi)問(wèn)題)

root : CMD ( /u33/admin/check_xxxxx.sh) : PID ( 303494 ) : Mon Sep 5 13:30:00 2011
Cron Job with pid: 303494 Successful
....
root : CMD ( /usr/run_ssa_encl_healthcheck) : PID ( 327904 ) : Mon Sep 5 15:30:00 2011
root : CMD ( /u33/admin/check_icmrm.sh ) : PID ( 303494 ) : Mon Sep 5 15:30:00 2011
Cron Job with pid: 327904 Successful
Cron Job with pid: 303494 Failed
  
303494 Failed有可能會(huì)匹配到,前面的紀(jì)錄.(但這只有在PID會(huì)相同的情形下)

==================================================
另外一個(gè)不比較不影響效率,也不用限制CMD紀(jì)錄數(shù)組​​的方法,又不會(huì)有以上bug的方法.
就是今天是Sep 6時(shí),先算出前一天(Sep 5)日期,仍后在紀(jì)錄CMD時(shí),先檢查是否為Sep 5
if($2=="CMD"
改為if($2=="CMD" && d1==sprintf("%s %2d",$7,$ )
這樣后面就不須要限制數(shù)組大小(因?yàn)榍耙惶斓腃MD紀(jì)錄,就會(huì)比較少了),直接
  a[$5] = $0 # $5 為PID號(hào)碼,不必限制數(shù)組大小,且PID重復(fù)時(shí),后一個(gè)會(huì)蓋過(guò)前一個(gè)
最后
  if($6=="Failed"&&a[$5]!=""){print a[$5]"\n"$0}
  else{print "cannot find the PID record in CMD"}
作者: rdcwayx    時(shí)間: 2011-09-08 09:35
  1. YESTERDAY=$(TZ=aaa24 date +"%b %e")

  2. awk -v d="$YESTERDAY" '/^Cron Job/&&/Failed/&&a[$5]~d{print a[$5] RS $0;next}
  3.           {a[$10]=$0}' infile.log
復(fù)制代碼

作者: bzbenjoy    時(shí)間: 2011-09-08 22:11
本帖最后由 bzbenjoy 于 2011-09-08 22:22 編輯

回復(fù) 7# jason680


    多謝,終于搞懂了你的代碼的意思,又學(xué)會(huì)了點(diǎn)東西,我后來(lái)想了下,根據(jù)你們和另幾個(gè)大大的的思路,也想出來(lái)了一種方法,只是這方法時(shí)間的問(wèn)題解決的還不是很好
  1. today=`date "+%b %e %Y"`
  2. yesterday=`TZ=aaa16 date "+%b %e %Y"`

  3. awk -F'[ :()]+' '
  4.                 BEGIN{flag=0;n=0}
  5.                 {     if($2=="CMD"){if($0 ~today||$0 ~yesterday){n=n+1;flag=1;a[n]=$0;continue;}}
  6.                        if(flag==1 && $1=="Cron"){for(i=1;i<=n;i++)
  7.                                                {if(index(a[i],$5)){  if(index($0,"Failed")){print a[i];print $0;}
  8.                                                                                         n=n-1;
  9.                                                                                         for(j=i;j<=n;j++)
  10.                                                                                              {a[j]=a[j+1];}
  11.                                                                                         break;
  12.                                                                                                  }}}
  13.                }
  14. 'log
復(fù)制代碼
只是這個(gè)方法,時(shí)間取得不是很精確,log日志里面時(shí)間跨度比較長(zhǎng)的話,就很糟糕,還沒(méi)想好要怎么解決
作者: bzbenjoy    時(shí)間: 2011-09-08 22:13
本帖最后由 bzbenjoy 于 2011-09-08 22:17 編輯

回復(fù) 8# rdcwayx


    請(qǐng)幫忙看看,這個(gè)awk代碼:
  1. today=`date "+%b %e %Y"`
  2. yesterday=`TZ=aaa16 date "+%b %e %Y"`

  3. awk -F'[ :()]+' '
  4.                 BEGIN{flag=0;n=0}
  5.                 {     if($2=="CMD"){if($0 ~today||$0 ~yesterday){n=n+1;flag=1;a[n]=$0;continue;}}
  6.                        if(flag==1 && $1=="Cron"){for(i=1;i<=n;i++)
  7.                                                                 {if(index(a[i],$5)){  if(index($0,"Failed")){print a[i];print $0;}
  8.                                                                                                 n=n-1;
  9.                                                                                                 for(j=i;j<=n;j++)
  10.                                                                                                 {a[j]=a[j+1];}
  11.                                                                                                 break;
  12.                                                                                                         }}}
  13.                }
  14. 'log
復(fù)制代碼
里面,為什么第六行的if($0 ~today||$0 ~yesterday)沒(méi)有生效,我執(zhí)行這個(gè)命令,發(fā)現(xiàn)所有的行都直接通過(guò),沒(méi)有進(jìn)行篩選?
作者: rdcwayx    時(shí)間: 2011-09-09 09:35
本帖最后由 rdcwayx 于 2011-09-09 09:36 編輯
回復(fù)  rdcwayx


    請(qǐng)幫忙看看,這個(gè)awk代碼:里面,為什么第六行的if($0 ~today||$0 ~yesterday)沒(méi)有 ...
bzbenjoy 發(fā)表于 2011-09-08 22:13



    系統(tǒng)變量的引用出錯(cuò)。

awk -v t="$today" -v y="$yesterday"

后面用t 和y 做判斷。




歡迎光臨 Chinaunix (http://72891.cn/) Powered by Discuz! X3.2