一、我们常常碰到在shell下执行某个命令能够成功,比如执行一个java程序:

java -jar /home/opscoder/topo-audit.jar,但是在crontab下执行会失败。

cornjob为 0 10 * * * java -jar /home/opscoder/topo-audit.jar: 即每天10点去执行这个jar中的main方法

二、查找失败的原因,即查看crotab的执行log, 有如下3种方法,我所用的是ubantu的机器,使用的是方法1、 mail任务(Linux UNIX)在 /var/spool/mail/root 文件中,有crontab执行日志的记录,用tail -f /var/spool/mail/root 即可查看最近的crontab执行情况。

2、针对UINX系统查询方法(AIX、HP-UX)

在 /var/spool/cron/tmp文件中,有croutXXX00999的tmp文件,tail 这些文件就可以看到正在执行的任务了。

3、针对Linux系统的查询方法(含Redhat、SUSE)

看 /var/log/cron这个文件就可以,可以用tail -f /var/log/cron观察

配图为系统aix root用户默认的crontab

三、针对我的情况,从log中可以看出是/bin/sh: java command not found

这就说明了cron使用的环境变量不是系统的环境变量,而是自己的环境变量,说白了,就是crontab不能读取到/etc/profile下的信息。

四、解决方法:

1、修改crontab来调用一个脚本,而不是直接执行这个jar

即将:cornjob为 0 10 * * * java -jar /home/opscoder/topo-audit.jar

修改为:0 10 * * * /home/opscoder/topo-check.sh

2、创建topo-check.sh

touchtopo-check.sh   #创建topo-check.sh文件
vi topo-check.sh         #编辑topo-check.sh文件,并输入如下内容

#!/bin/bash
source /etc/profile
java -jar /home/opscoder/topo-audit.jar

保存退出。
chmod +x topo-check.sh    #给topo-check.sh可执行权限

这样就大功告成了,需要注意的是需要加上#!/bin/bash,不然crontab可能还是不能执行成功,使用如上的3中方法之一来查看crontab的log,你会发现类似: /bin/sh command /home/opscoder/topo-check.sh not found

附:如果当前用户不能启动crontab,可以使用具有sudo权限或者具有启动权限(service)的用户先启动crontab(service
cron status, service cron start, service cron start),然后再切回该用户创建或者cron
job(crontab -e)

crontab执行java命令失效的更多相关文章

  1. 穿越之旅之--android中如何执行java命令

    android的程序基于java开发,当我们接上调试器,执行adb shell,就可以执行linux命令,但是却并不能执行java命令. 那么在android的shell中是否就不能执行java程序了 ...

  2. Android 如何执行java命令

    android的程序基于java开发,当我们接上调试器,执行adb shell,就可以执行linux命令,但是却并不能执行java命令. 那么在android的shell中是否就不能执行java程序了 ...

  3. CentOS下crontab执行java程序

    阿里云CentOS收不到邮件 在crontab里配置执行脚本,脚本用来执行java程序,死活不执行.单独执行脚本可以运行. 查看crontab的日志文件,/var/log/cron,发现没有收到cro ...

  4. 在执行Java命令或eclipse启动程序,提示报错’jvm.cfg无法找到’的解决办法

    一.问题背景 昨天debug代码的时候,突然发现无法启动程序了.每次启动程序的时候均报如下错误:(回家以后重现了下这个问题.发现不同电脑,所在的lib下的文件夹不一样,应该和jdk安装时硬件的情况有关 ...

  5. 通过adb命令在Android设备中执行Java命令, 并调用so文件。

    一.难点一:无法复制so文件到/system/lib或者/vendor/lib下,提示只读 解决方法: 2.使用android device monitor放库进入到 /system/lib出现只读权 ...

  6. 在命令符模式下编译并执行Java程序

    对于Java初学者,建议使用纯文本文件来编写Java程序,并在命令符模式下使用工具程序编译和执行Java程序.使用javac工具编译.java,使用java工具执行.class.(推荐sublime编 ...

  7. linux定时任务crontab怎样执行root命令

    在/var/spool/cron/文件夹下放置了所有定时任务文件, 1.运行crontab -u $用户名 -e会显示$用户的所有定时任务: 2.运行sudo crontab -e会显示root用户所 ...

  8. crontab执行脚本失败问题

    如果脚本在终端执行正常,而在crontab里执行失败, 一般跟root用户无关,而是和系统变量有关,一般加上绝对路径执行java命令即可: /usr/java/jdk/bin/java xxx.jar

  9. javac 及 java命令的使用问题(错误或无法加载主类)

    一.问题 使用 javac 命令编译完.java源文件后,用 java 命令运行.class文件时,通常会遇到如下或类似的问题: 错误: 找不到或无法加载主类 HelloWorld.class 二.解 ...

随机推荐

  1. IntelliJ IDEA 开发工具项目maven管理

    今天自己重新部署一下intellij下的项目开发环境,顺便把maven管理项目jar包的方法梳理一下 (1)首先下载apache-maven-3.0.4版本的maven,我自己解压在D:\maven\ ...

  2. << 移位运算

    /** * The maximum capacity, used if a higher value is implicitly specified * by either of the constr ...

  3. Spring Data JPA教程, 第四部分: JPA Criteria Queries(未翻译)

    The third part of my Spring Data JPA tutorialdescribed how you can create custom queries by using qu ...

  4. [置顶] 栈/入栈/出栈顺序(c语言)-linux

    说明: 1.栈底为高地址,栈顶为低地址. 2.入栈顺序:从右到左. 解释1:栈在内存中的结构 [注:0x00 到 0x04之间间隔4个地址] 入栈:指针先指向0x10,从高地址向低地址方向填数值,最终 ...

  5. 本地搜索神器-Everything

    现在硬盘越来越大了,经常机器上一堆资料,要找的时候,无论是XP还是Win7,都要搜索半天. 如果使用Everything,可以大大的加快这个过程. 具体的评价请看http://www.appinn.c ...

  6. checked 选中

    <input type="radio" name="singleAnswer" value="0" <s:property va ...

  7. sgu - 269 - Rooks

    题意:给出一个n行的棋盘,每行的长度任意,问在该棋盘中放k个车(不能同行或者同列)有多少种放法(n <= 250, 每行的长度 <= 250). 题目链接:http://acm.sgu.r ...

  8. Linux单词表

     su:Swith user  切换用户,切换到root用户cat: Concatenate  串联uname: Unix name  系统名称df: Disk free  空余硬盘du: Disk  ...

  9. Displaying Alerts with UIAlertView

    UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:@"Alert" message:@"You've ...

  10. C#制作在线升级程序

    //这是一个webservice private AppUpdate.UpdateServ UpdateSvr; private void button1_Click(object sender, S ...