日期:2014-05-16  浏览次数:20629 次

linux中crontab定时任务启动Java程序碰到的问题

最近工作需求,需要在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