前几天,发现一个在服务器通过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表示前面程序的输出结果 保存