日期:2014-05-16 浏览次数:20667 次
最近工作需求,需要在Linux中启动定时任务,每隔2分钟调用一个Java程序,碰到一系列的问题,总结如下
1.crontab定时任务如果指定了结果输出流文件,则要输入 2>&1 才会将结果输出到指定的文件,如
*/2 * * * * /opt/a8box/mb_umdtasker/create_umd.sh >/opt/a8box/mb_umdtasker/out.log 2>&1
如果要将标准流与错误流输出到Linux回收站中,即不显示任何东西,则需要加上 /dev/null 如
*/2 * * * * /opt/a8box/mb_umdtasker/create_umd.sh >/opt/a8box/mb_umdtasker/out.log /dev/null 2>&1
2 在Linux定时器当前目录会产生问题,如果Java工程需要在同级目录下加载一些配置文件(如连接数据库的信息),则当前目录会加载不到,此时,可以在java命令设置当前路径系统属性,程序中根据该属性动态加载配置文件
setsid java -Dbase_dir="/opt/a8box/mb_umdtasker/" -jar /opt/a8box/mb_umdtasker/mb_content_umdtasker.jar
在程序中可以用
String path = System.getProperty("base_dir");
3 Java工程中的log4j日志输出文件一般都是配置在当前目录下,而在Linux定时器中会有问题,即当前目录并不是Java程序所在的目录了,而log4j配置文件又在Java程序源文件中,则可以将log4j.properties提取出来,在Java工程中动态加载
String path = System.getProperty("base_dir"); File log4jfile = new File(path+"/"+"log4j.properties"); if(log4jfile.exists()){ PropertyConfigurator.configure(path+"/"+"log4j.properties"); }
4 手动执行启动Java程序没有问题,Linux定时器启动Java程序会丢失环境变量的配置,需要在shell脚本中加入环境变量
source /etc/profile setsid java -Dbase_dir="/opt/a8box/mb_umdtasker/" -jar /opt/a8box/mb_umdtasker/mb_content_umdtasker.jar