背景:最近在linux服务器上写了个脚本监控tomcat进程和磁盘使用率,当tomcat进程挂了或者磁盘使用率超过50%之后,shell脚本调用java程序发送短信进行告警。用crontab来实现shell脚本的定时执行。
在测试的时候,手机迟迟没有收到告警短信。
于是查看日志发现报了两个错误:
第一个问题:
第二个问题:
Exception in thread "main" java.lang.UnsupportedClassVersionError: com/test/inherited/InheritableSon : Unsupported major.minor version 52.0
at java.lang.ClassLoader.defineClass1(Native Method)
at java.lang.ClassLoader.defineClass(ClassLoader.java:800)
at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:142)
at java.net.URLClassLoader.defineClass(URLClassLoader.java:449)
at java.net.URLClassLoader.access$100(URLClassLoader.java:71)
at java.net.URLClassLoader$1.run(URLClassLoader.java:361)
at java.net.URLClassLoader$1.run(URLClassLoader.java:355)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:354)
at java.lang.ClassLoader.loadClass(ClassLoader.java:425)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:308)
at java.lang.ClassLoader.loadClass(ClassLoader.java:358)
at sun.launcher.LauncherHelper.checkAndLoadMain(LauncherHelper.java:482)
问题一是ifconfig命令无法找到,问题二出现的原因是:我们使用高版本的JDK编译的Java class文件试图在较低版本的JVM上运行。
一开始我很奇怪,为什么直接执行shell脚本没有问题,但是配置到crontab里面之后,就会出现这两个鬼问题。
后来在网上搜了几篇博客之后知道了,原来crontab执行时有自己的环境变量,和用户的环境变量是不一样的,所以导致了上述两个问题。
详见这篇blog,写的十分的详细(http://blog.youkuaiyun.com/dancen/article/details/24355287)
处理第一个问题的方法:
在shell脚本中 把 ifconfig 改成 /sbin/ifconfig 配置好绝对路径之后就可以找到ifconfig了。
处理第二个问的方法:
上面我引用的那篇blog里面已经给出了好几种方法了,直接在shell脚本里面加上一句 source /etc/profile
我的linux服务器的java版本是1.8,java程序所用的java版本也是1.8,crontab用的jdk是1.7的 ,所以直接source下 profile文件就行了,这样crontab就知道该用1.8版本的JDK了。
或者在开发这个java程序的时候,将其所用的jdk改成改成1.7,这样子运行编译打包出来的jar包也不会出现上述的第二个错误。
在eclipse中修改项目所有的jdk的方式如下:
右键项目名称 -> properties -> Java Builder Path -> Libraries -> 左键单机 JRE System Library -> Edit 改变项目所用的JDK版本
然后在 properties -> Java Compiler -> 配置编译项目所用的jdk版本。
第一次写博客,写的有点烂233,排版也不好看,大家凑活看吧。