作者:胡慧君孟勋欣怡 | 来源:互联网 | 2023-05-16 10:14
在linux下面,我有个java程序要定时运行,就写了一个shell来运行,手工运行没有问题,可是将shell放到crontab里面执行的时候就没有达到预期的效果了。在java里面我用System.o
在linux下面,我有个java程序要定时运行,就写了一个shell来运行,手工运行没有问题,可是将shell放到crontab里面执行的时候就没有达到预期的效果了。在java里面我用System.out.println打印调试,可是没有看到任何输出,不知道输出到哪里去了。如果手工运行可以看到调试数据的。
很是郁闷,可能跟环境有关,可是配置检查环境没有发现问题。
8 个解决方案
cron运行的log一般都是在/var/spool/cron下面的。
但是syste.out.print一般你是看不到的,因为你是后台运行的。
一般cron无法运行无非就是下面几个问题
1,用户无权限
2,class文件的路径不对,或者classpath中设置的相关类找不到
你可以设置好时间之后去运行cron,然后看看log下面的东西是不是真的运行了
比如crontab
11 * * * * * * test.sh
到了11分之后你去看看log
在linux下面,我有个java程序要定时运行,就写了一个shell来运行,手工运行没有问题,可是将shell放到crontab里面执行的时候就没有达到预期的效果了。
crontab执行程序确实和你登录用户的环境有些差异。
一般用户登录到linux后,
ls -al
会看到一个.bash_profile或者.profile文件
你最好写一个简单的脚本,如:startJava.sh
内容为
cd $HOME
. ./bash_profile
java -jar xxx #启动你的java程序
在java里面我用System.out.println打印调试,可是没有看到任何输出,不知道输出到哪里去了。如果手工运行可以看到调试数据的。
很是郁闷,可能跟环境有关,可是配置检查环境没有发现问题。
crontab下如果正确执行了程序,system.out.println的输出会通过linux mail的方式发给这个用户,
在你下次登录的时候,你会发现系统提示:you have new mails,
然后你打:mail,就可以看到一系列新邮件的列表,直接输入邮件的编号就可以查看内容了。
另外,你也可以使用nohup方式来调度程序,这样,系统会将system.out.println的输出,重定向到一个nohup.out文件中:
nohup java -jar xxx
在crontab中定时执行的命令不应该有控制台输出(你可以用输出重定向来达到这个目的),因为它根本不打开控制台。如果有控制台输出会转成向你发一封邮件,邮件的内容就是这次执行命令时产生的控制台输出。