Linux执行Cron Job失败,在Shell sh下执行却能成功 - 环境变量?

本文探讨了在Linux环境下使用Cron任务执行Java jar包命令时遇到的问题及解决方案,通过创建调用jar包的脚本来解决Cron任务无法读取系统环境变量导致的执行失败问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、我们常常碰到在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)

 

 

要在Linux环境下自动化Kettle的增量数据导入作业并设置定执行,你将需要进行一系列的配置和脚本编写工作。首先,确保Kettle的作业文件(.kjb)已经准备妥当,并在Windows环境下测试无误。接下来,根据《Linux环境下详细部署Kettle作业与定运行》的指导,你可以按照以下步骤进行: 参考资源链接:[Linux环境下详细部署Kettle作业与定运行](https://wenku.youkuaiyun.com/doc/4ikv4zhhkx) 1. **安装JDK并设置环境变量**:在Linux服务器上安装JDK,并通过编辑`~/.bashrc`或`~/.bash_profile`文件来设置`JAVA_HOME`和`PATH`变量。确保JDK路径正确无误,以便Kettle能够找到JVM。 2. **传输文件到Linux服务器**:使用PSFTP或SCP将.kjb和.ktr文件上传到Linux服务器。例如,上传到`/home/ubuntu/data-integration/`目录下。 3. **解压Kettle安装包**:下载并解压Kettle的tar.gz文件,通常使用`tar -zxvf`命令。解压完成后,进入解压目录,通常是`data-integration`。 4. **调整作业和转换文件位置**:将作业和转换文件从上传目录复制到Kettle目录下,例如`/home/ubuntu/data-integration/transformations`。 5. **编写执行脚本**:创建一个shell脚本,例如`run_kettle.sh`,用于运行Kettle作业。脚本内容可能如下: ```bash #!/bin/bash /home/ubuntu/data-integration/kitchen.sh -file=/home/ubuntu/data-integration/my_job.kjb ``` 确保脚本有执行权限,使用`chmod +x run_kettle.sh`命令。 6. **设置定任务**:使用`crontab`命令创建定任务。打开当前用户的crontab文件: ```bash crontab -e ``` 添加一行定任务,例如每天凌晨1点执行: ```bash 0 1 *** /home/ubuntu/run_kettle.sh >> /home/ubuntu/kettle_run.log 2>&1 ``` 7. **保存并退出crontab**:通常按下`Ctrl+X`,然后按`Y`保存更改退出编辑器。 现在,Kettle作业已经配置为每晚1点自动执行,增量数据导入的任务将按计划运行。这样,你可以确保数据处理自动化和效率的最大化。如果你希望深入了解更多关于Kettle的高级特性和最佳实践,建议阅读《Linux环境下详细部署Kettle作业与定运行》一文,它将帮助你进一步掌握Kettle在Linux环境中的部署和管理技巧。 参考资源链接:[Linux环境下详细部署Kettle作业与定运行](https://wenku.youkuaiyun.com/doc/4ikv4zhhkx)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值