繁体   English   中英

cron.daily的脚本

[英]script for cron.daily

我需要每天一次在Linux机器上运行Java程序。 所以我创建了一个只有一行的简单文件:

java -jar /opt/location/my_jar.jar

并假设它每天运行一次,然后将其放入etc / cron.daily。 但是它根本没有运行。 我尝试都使用.sh扩展名,或者仅使用不带扩展名的文件名。 仍然没有运气。

我在Google上搜索了一下,但是却得到了很多相互矛盾的信息。 有人可以帮忙吗?

编辑:

根据Satish和Mithrandir给出的答案,我正在总结当前的位置。

1.我使用vi创建了run_conversions脚本,以解决Windows上行尾字符的问题。 现在脚本是

#!/bin/sh
/usr/bin/java -jar /opt/location/my_jar.jar

2.我每小时将它放在/ etc / cron。

3.在/ var / log / cron处检查日志,我发现它每小时开始运行run_conversions和结束run_conversions。 到现在为止还挺好。

4.但是好像我的jar文件没有运行。 我知道这是因为,当它正常运行时,它应该更新数据库-并且数据库没有更新。

5,奇怪的是:我每小时手动运行cron。

run-parts /etc/cron.hourly

jar文件被正确击中,并且数据库正在更新。

总结一下:在运行部件中运行时,它可以工作。 如果让它自己每小时运行一次,则不会。

有任何想法吗?

编辑2:

遵循Satish,Mithrandir和vahid的建议,我将run_conversions_loc更改为如下形式:

#!/bin/bash
SHELL=/bin/bash
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bexport SHELL=/bin/bash
/usr/bin/java -jar /opt/tf/conversions/aff_networks2.jar > /opt/tf/conversions/runconversions.txt

我从cron.hourly中删除了脚本,并将此行添加到crontab中:

*/10 * * * * /opt/tf/conversions/run_conversions_loc

脚本现在每10分钟运行一次,并在cron日志中注册,如下所示:

Feb 24 09:30:01 backsome CROND[7933]: (root) CMD (/opt/tf/conversions/run_conversions_loc)

到目前为止看起来还不错。 但是数据库(应更新的数据库)未更新。

更深入地了解它,jar文件aff_networks2.jar在本地目录(与该目录相同的目录)中寻找ftr.properties文件。 该文件存在于此目录中。 但是它没有被正确读取。 我知道这一点是因为在输出文件runco​​nversions.txt中,应从属性文件读取的值为null。

完成图片的两件事:

  1. 转换目录中的所有内容都具有777权限。 我知道不建议授予此类扩展权限,但我想确保(至少尝试)这不是问题。

  2. 当我通过调用./run_conversions_loc从外壳运行脚本时,脚本将运行,查找属性文件并更新数据库。 我以root用户身份登录到Shell,还以root用户身份创建了所有相关文件,并以root用户身份安装了在crontab中调用脚本的行。

有什么想法为什么不cron读取属性文件?

示例解决方案:

在命令行上手动运行命令:

[root@04 cron.daily]# /usr/bin/java -jar /root/HelloWorld.jar
Hello World #1

让我们在etc/cron.daily/test.sh创建一个脚本,并赋予执行权限:

#!/bin/bash
/usr/bin/java -jar /root/HelloWorld.jar

注意:如果您遇到dos字符问题或错误/bin/bash^M: bad interpreter: No such file or directory运行dos2unix /bin/bash^M: bad interpreter: No such file or directory

[root@04 cron.daily]# unix2dos test.sh
unix2dos: converting file test.sh to DOS format ...

测试一下,瞧!

[root@04 cron.daily]# run-parts /etc/cron.daily
/etc/cron.daily/ldiscan:

kcore: Value too large for defined data type
/etc/cron.daily/test.sh:

Hello World #1

它可能是您的环境变量

在执行脚本时,当前用户是否可以登录?

如果是这样的话

跑:

env|egrep "(^PATH=|^SHELL=)"|awk '{print "export "$1}'

然后将输出结果放到脚本的顶部,然后从现在开始的2分钟内尝试另一个cron看看它是否有效

更新了答案,以回应Eddy 2013年2月24日的评论。

我想为您提供有关crontab的速成课程。

  1. 可以通过全局/ etc / crontab或在用户下以crontab -e(编辑特定用户的cron)或crontab -l(列表-每个用户存储在/ var / spool / cron中)的方式设置crontab

我看到您正在尝试尝试每次运行10分钟,这在/ etc / crontab中很好

我之所以建议给出当前shell的整个类路径,是因为大多数情况下,脚本都在尝试使用unix命令,该命令在crontab的PATH中不可用(该命令位于/ etc的最顶部) / crontab文件本身)

要调试路径问题,通常最好将crontab正在执行任务的用户邮箱监视为:所以tail -100 / var / spool / mail / root并查找与该cron任务相关的任何消息以及cron会按照某人的建议进行日志记录-

我不认为您的问题是这里的路径。

您正在尝试运行Java jar文件,可能是您的jar文件需要该转换文件夹中的其他文件,并且在您运行它时,您已经在该文件夹中。

因此,您可以在脚本中运行

cd /opt/tf/conversions/;
 /usr/bin/java -jar aff_networks2.jar > /opt/tf/conversions/runconversions.txt

但是,由于这是一个很小的脚本,因此您可以将整个内容放置为cron条目,而完全绕开shell脚本,就可以避免这种情况

*/10 *    * * *   root cd /opt/tf/conversions/; /usr/bin/java -jar aff_networks2.jar > /opt/tf/conversions/runconversions.txt

希望这有助于解决这个问题

将文件更改为:

#!/bin/sh
/usr/bin/java -jar /opt/location/my_jar.jar

检查/usr/bin/java是否实际上是命令所在的位置( which java )。 将文件的权限更改为可执行文件:

chmod +x /opt/location/my_jar.jar

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM