cron.daily的脚本

时间:2013-02-21 16:41:46

标签: linux cron

我需要每天一次在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.hourly中。

3.检查/ var / log / cron中的日志我看到它每小时启动run_conversions并完成run_conversions。到现在为止还挺好。

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

5.这是奇怪的事情:当我手动运行cron.hourly但是打电话

run-parts /etc/cron.hourly

jar文件属性命中,数据库正在更新。

总结一下:当通过run-parts运行它时,它可以工作。当它每小时自己运行时,它不会。

有什么想法吗?

编辑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从shell运行脚本时,它会运行,找到属性文件,并更新数据库。我以root身份登录到shell,我还以root身份创建了所有相关文件,并以root身份安装了用于在crontab中调用脚本的行。

  3. 任何想法为什么不是cron读取属性文件?

3 个答案:

答案 0 :(得分:2)

解决方案示例:

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

[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

注意:运行dos2unix,以防您遇到dos问题或错误/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

答案 1 :(得分:1)

它可能是你的环境变量

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

如果是的话

运行:

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

然后获取输出并将其放在脚本的顶部,并在2分钟内尝试另一个cron,看看它是否有效

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

我想给你一个关于crontab的速成课程。

  1. 设置crontab可以通过全局/ etc / crontab或用户下crontab -e(编辑特定用户的cron)或crontab -l(列表 - 存储在每个用户的/ var / spool / cron中)
  2. 我看到你试图尝试运行10分钟,这在/ etc / crontab中很好

    我建议给出当前shell的整个类路径的原因是因为大多数时候脚本试图使用unix命令,该命令不能作为crontab的PATH的一部分(位于最顶端的位置) / etc / crontab文件本身)

    要调试路径问题,通常最好查看crontab正在执行任务的用户的邮箱: 所以尾巴-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
    

    希望这有助于解决此问题

答案 2 :(得分:0)

将文件更改为:

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

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

chmod +x /opt/location/my_jar.jar