前幾天,發現一個在服務器通過crontab執行的一個java程序,突然不執行了。后來經過排查,是由於運維在其他項目上線的時候,不知道什么原因,導致crontab中jar文件的執行,通過java -jar執行不了了,必須修改為java的全路徑/usr/java/jdk1.7.0_79/bin/java -jar才可以執行。原因因該是java的一些什么路徑問題,這個沒有具體去了解。
就打算在程序中添加一個監控,不然程序掛了也不知道,必須數據出現問題了,才有可能發現問題。
首先,在程序中添加監控是沒有用的(而且程序中本來就有監控的),因為是java路徑導致的問題,所以Java 程序根本就沒有執行,里面寫再多監控,程序不執行的話,也是沒用的啊。
就想着crontab中是不是有監控的功能,畢竟這個是crontab任務執行失敗了,后來在網上發現了這篇文章
http://my.oschina.net/abcfy2/blog/200351
我測試了一下 可以通過MAILTO定義一個自己的郵箱,來接收郵件。但是問題又來了,這個會把所有的stdout輸出都通過郵件發送給你,由於我的程序是會產生日志的。這就導致,程序每次執行,都會給我發送郵件,起不到想要的效果。
然后就在網上找到了這篇文章
http://blog.csdn.net/aderben/article/details/16841027
看到這個地方:
**************************************************
先看一個例子:
0 2 * * * /u01/test.sh >/dev/null 2>&1 &
這句話的意思就是在后台執行這條命令,並將錯誤輸出2重定向到標准輸出1,然后將標准輸出1全部放到/dev/null 文件,也就是清空。
在這里有有幾個數字的意思:
0表示鍵盤輸入
1表示標准輸出
2表示錯誤輸出.
********************************************************
想到可不可以通過只有錯誤輸出的時候,才發送郵件呢? 經過測試,終於成功了,最終的命令這樣寫就可以了:
MAILTO=username1@mail.com,username2@mail.con(可以定義多個郵箱接受,逗號分割)
0,15,30,45 * * * * /usr/java/jdk1.7.0_79/bin/java -jar userjava.jar 2 > /dev/null 1>&1
意思是在執行程序的時候,只有錯誤輸出才會輸出(userjava.jar 2 > 這個2 定義的程序的錯誤輸出) 輸出到/dev/null 也就是清空 后面的1>&1表示前面程序的輸出結果 保存