我需要每天一次在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
文件 - 它所在的目录。该文件存在于此目录中。但它没有正确阅读。我知道这一点,因为在输出文件runconversions.txt中,应该从属性文件中读取的值为null。
完成图片有两件事:
转化目录中的所有内容都有777个权限。我知道不建议提供这样的扩展权限,但我想确保(至少尝试)它不是问题。
当我通过调用./run_conversions_loc
从shell运行脚本时,它会运行,找到属性文件,并更新数据库。我以root身份登录到shell,我还以root身份创建了所有相关文件,并以root身份安装了用于在crontab中调用脚本的行。
任何想法为什么不是cron读取属性文件?
答案 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的速成课程。
我看到你试图尝试运行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